2013-05-29 53 views
0

假设常规控制器和ApiController的上下文的ProxyCreationEnabledLazyLoadingEnabled分别设置为truefalse当通过EntityState.Modified进行更新时,EF做了什么?

有一种方法可以更新EF中的实体,将其状态设置为EntityState.Modified

_context.Entry(newEntity).State = EntityState.Modified; 
_context.SaveChanges(); 

当实体被装载在Controller一切正常。至于ApiController我的导航属性为null - 因为禁用该上下文实例的代理。

如果我更改任何属性或将其状态设置为Modified并保存更改会发生什么情况? 实体框架将与那些null导航属性做什么?

回答

2

这取决于您是使用独立还是外键关联。

对于独立关联 - 这些关联没有将外键作为模型中的属性,但只有导航属性 - 如果您设置了导航属性和数据库中的外键值,则不会出现任何情况状态为Modified。它们保持不变,因为生成的UPDATE语句不会包含FK列值的更改。顺便说一下,如果导航属性是而不是null。将实体状态设置为Modified不会影响导航属性,只会影响标量属性。

如果您有外键关联 - 将外键作为模型中的属性的关联 - 将状态设置为Modified将会将外键属性标记为Modified,因为它是标量属性。因此,当前的FK属性值将被写入数据库,并且可能会更改那里的关系,即使导航属性为null

+0

我确实有外键关联,所以如果我通过Entity.State = EntityState = Modified'更新,导航属性**将被分配给** null。有没有办法实现这一点,任何指针将不胜感激,谢谢! – Esteban

+1

@Esteban:“*有没有办法实现这个*”:你的意思是说你实际上**希望**参考在数据库中被清除掉了吗?在这种情况下,对于外键关联,你应该有一个可为空的外键属性(如'int?')。如果此属性为null,并且您将状态设置为Modified,则null将写入DB中。 – Slauma

+0

不,我不希望我的导航属性设置为空。这就是我需要阅读的:'你应该有一个可为空的外键属性(如int?)。如果此属性为空,并且您将状态设置为Modified,则空值将写入数据库。“非常感谢您的时间! – Esteban

相关问题