CSharp - 使用 Entity Framework ( 代码优先) 更新/更改具有可以空关联的实体

  显示原文与译文双语对照的内容

我有一个关联( 。虚拟,lazyloaded one-to-one-or-null ),我想将它设置为 null 。 我发现它是不可能的,除非你先加载这个关联,然后重新加载它,然后将它设为 null 。


someEntity.AnotherEntity.ToString();//Needs to be done in order to force a load since im using a service that wraps a generic repository
someEntity.AnotherEntity = null;//Now this works because i loaded 上面.

我在许多地方,似乎在加载someEntity是一个选项,或者向 SomeEntity 添加一个新属性:


[ForeignKey("AnotherEntity")]//With this annotation
int? AnotherEntity_Id//Added this property

然后使用可以空的AnotherEntityId,而不是关联属性 AnotherEntity 。

我现在使用第二种方法,它会阻塞实体,但看起来更加实体,因为你也不需要额外的SQL调用。

  1. 为什么我不能将关联设置为null并有效地理解这个?

  2. 我正在使用的第二种方法呢。 是一个好的实践还是有更好的方法?

时间: 作者:

1 为什么我不能将关联设置为 null,并且有有效的理解?

这是因为你的实体具有延迟加载的特性。 在延迟加载时,实体在导航属性上调用 get 方法之前不会在属性中具体化。 如果调用 set,肯定会将属性字段设置为 null,但是EF将忽略它,因为它是空的。 属性字段的备份直到你调用 get 时才会被填充,除非你立即加载。

2 我使用的第二种方法。 是一个好的实践还是有更好的方法?

如果你还没有立即加载,那么一个简单的解决办法是强制加载延迟加载,通过执行以下操作:


if (someEntity.AnotherEntity!= null)//this will lazy load the instance
 someEntity.AnotherEntity = null;//now tell EF to remove the association

如果if块中的语句将调用属性上的获取方法,并在还没有加载它的情况下对它进行调用。 现在to了解这个实体,因这里当你在下一行设置to时,to会记住你希望将更改保存。

同样,如你所说,如果公开了一个可以为关联的可以空外键属性,就可以将它设置为。 因为它不是虚拟的,更改为null也会同样的效果告诉你想要删除的关联。

作者:
...