在我的每个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。这有什么原因导致无效吗?因此,我无法删除子实体并将更改保留在数据库中。
答案 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;)
我在这个领域有一些经验,所以如果你还有其他问题......
我认为最初的问题有原因,但你的解决方案有点粗糙。