为何Entity Framework不会将ICollection<T>作为实体字段添加?
为什么ICollection不会被Entity Framework作为实体字段添加?
这其实是Entity Framework(EF)处理实体间关联关系的默认行为,我来给你拆解清楚:
ICollection<Log>是导航属性,而非普通字段
你定义的public virtual ICollection<Log> logs { get; set; }在EF里属于导航属性,它的作用是表示User和Log之间的一对多关联关系(一个用户对应多条日志)。数据库本身没法直接存储集合类型的数据,所以EF不会把它映射成User表中的列。EF通过外键维护关联关系
为了实现这种关联,EF会自动在关联的Log实体对应的数据库表(也就是你迁移代码里的dbo.Logs)中生成一个外键字段——你看到的User_userID就是这个外键,它会关联到User表的主键userID。通过这个外键,EF就能在查询User数据时,自动帮你加载对应的Logs集合(这也是你加virtual关键字的意义,用来支持延迟加载)。看你的迁移代码就能明白:
迁移里只给User表创建了userID和username两个字段,而Logs表除了自身的字段,多了User_userID这个外键,这就是EF为了维护User和Log的一对多关系做的处理。
如果你的需求是想在User表中直接存储集合类数据(比如把日志序列化成JSON存储),这在EF Core里可以通过值转换器实现,但这和导航属性的关联关系是完全不同的用法哦。
内容的提问来源于stack exchange,提问作者Guywain
相关产品推荐
相关产品推荐

