2

在我的每个 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。是否有原因导致这不起作用?因此,我无法删除子实体并将更改保存到数据库中。

4

2 回答 2

2

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

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

这解决了我遇到的问题。

于 2010-08-18T20:52:55.990 回答
0

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

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

我不知道对象上下文是否会首先允许这样做。但它至少有点低效。发送一个更新的 EntityA,它告诉对象上下文(context.ApllyChanges(EntityA))添加这个 EntityB,然后立即,mwoah 也删除这个相同的 EntityB;)

我在这方面有一些经验,所以如果您还有其他问题...

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

于 2010-12-12T20:02:34.613 回答