为什么TrackableCollection <t>没有为删除的项调用MarkAsDeleted方法?</t>

时间:2011-06-30 17:15:04

标签: entity-framework self-tracking-entities

在WPF的组合中使用自我跟踪实体时遇到问题。

我为exmaple设置了两个实体:人物和数字。每个人都有很多号码,很多号码都可以有人。

这里是我希望删除数字的示例代码:

using (var db = new Model.SampleEntities())
{
    list = db.People.Include("Numbers").ToList();
}

var samplePerson = list[0];
samplePerson.StartTracking();
var number = samplePerson.Numbers.First();
p.Numbers.Remove(number);

using (var db = new Model.SampleEntities())
{
    foreach (Model.Person person in list)
    {
        db.People.ApplyChanges(person);
    }
    db.SaveChanges();
}

它不会从DB中删除该号码。

当我通过覆盖RemoveItem方法并添加以下代码来更改TrackableCollection类(由自跟踪T4模板生成)时,它按预期工作:

protected override void RemoveItem(int index)
{
    var entity = ((IObjectWithChangeTracker)this[index]);
    base.RemoveItem(index);
    entity.MarkAsDeleted();
}

我把MarkAsDeleted方法放在这里是否正确?所以我应该更改TT文件以将此代码放在TrackableCollection类中。这是一个好方法吗?

1 个答案:

答案 0 :(得分:2)

不,这不对。你和人之间有多对多的关系。删除关系(仅删除联结表中的记录)和删除项目本身之间应该严格区别,并且不应自动进行此操作,因为删除数字可能会影响您目前不使用的许多其他人员(此外没有级联删除你会在这种情况下得到例外)。

如果您要删除关系并手动删除项目调用MarkAsDeleted。此外,如果没有更大的努力,您的更改将影响模型中不是您想要的所有实体。