自我跟踪实体 - 从导航属性中删除不会将状态设置为“已删除”

时间:2010-08-18 19:34:49

标签: c# .net entity-framework entity-framework-4 self-tracking-entities

在我的每个POCO的构造函数中,我都有:

this.StartTracking();

确保为我的某个POCO的每个实例启用跟踪。我有一个实体A,其中包含一个实体B的TrackableCollection。当我加载我的实体A实例时:

using(MyContext ctx = new MyContext())
{
    entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id== id).FirstOrDefault();
}

查看实体A上的ObjectsAddedToCollection属性,有1个对象标记为“未更改”。当我执行entityA.EntityB [0] .MarkAsDeleted()时,状态不会设置为'已删除'并移动到ObjectsRemovedFromCollection集合。它完全被删除了。我仔细检查了,并且对于实体A和实体B,ChangeTrackingEnabled都设置为True。这有什么原因导致无效吗?因此,我无法删除子实体并将更改保留在数据库中。

2 个答案:

答案 0 :(得分:2)

这似乎是一个错误。在方法RecordRemovalFromCollectionProperties中,我更改了简单返回的行:

if(((IObjectWithChangeTracker) value).ChangeTracker.State == ObjectState.Added)
    return;

这解决了我遇到的问题。

答案 1 :(得分:0)

通过更改此生成的代码非常危险。 RecordRemovalFromCollectionProperties方法的作用是查看是否有添加的对象再次被删除(最终状态=没有添加或删除实体,添加和删除“相互冲突”,你看......?)。这就是为什么还有一个RecordAdditionToCollectionProperties对我之前解释的内容进行“反向”检查。

现在,通过对ChangeTracker的此方法进行更改,您可能会发送一个EntityA,该EntityA具有已添加的EntityB和已删除的EntityB(它们是相同的实例)。这可以由用户或代码完成。

我不知道对象上下文是否会首先允许这样做。但它至少有点无用。发送更新的EntityA,表示对象上下文(context.ApllyChanges(EntityA))添加此EntityB,然后立即删除mwoah同样的EntityB;)

我在这个领域有一些经验,所以如果你还有其他问题......

我认为最初的问题有原因,但你的解决方案有点粗糙。