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