每当我通过设置ForeignKey-ID将外键实体添加到我以前的实体时,关联的对象为空。
让我解释一下:
在上一步中,我将AddressId
属性设置为28
,并通过调用context.SaveChanges()
保存了实体上下文。
现在为什么AddressId
被填充,但是Address
作为NavigationProperty(应该是Address
表的Address
对象Address.Id == 28
){ {1}}?
答案 0 :(得分:2)
实体框架(EF)按设计工作。 更新外键永远不会更新导航属性。
但是,更新导航属性将更新密钥。另请注意,在这种情况下,Address
实体应来自相同的上下文。如果不是.SaveChanges()
,则将Address
实体视为新实体,并尝试将其添加到数据库中。
关于哪种方法更好的问题,嗯,这取决于! - 更新密钥非常简单,是我们一直在使用数据传输对象(DTO)甚至纯SQL进行的操作。因此,EF的新手更容易掌握和使用 - 更新导航属性是您真正获得基于对象的数据模型的地方。代码看起来更干净,更易读。但是你需要非常小心Context。在我对EF的个人经验中,我发现尝试更新导航属性带来的复杂性高于价值,尤其是在多层架构中,Context隐藏在数据访问层之后。
在我看来,EF最重要的好处是使用LINQ-to-Entities进行查询操作。我有查询和强类型的编译时语法检查。我可以轻松地创建一个基于对象的结果集,其中包含多个级别的子级,数据绑定就绪,无需任何其他代码。我很少再写SQL了。
答案 1 :(得分:0)
我通过重新创建我的实体然后重新加载来解决 这个问题。这似乎工作并重新获取n:m关系导航属性。怪异。