Entity framework 为什么选择TrackableCollection<;T>;不';是否为删除的项目调用MarkAsDeleted方法?

Entity framework 为什么选择TrackableCollection<;T>;不';是否为删除的项目调用MarkAsDeleted方法?,entity-framework,self-tracking-entities,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 num

在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();
}
它不会从数据库中删除该号码

当我通过重写RemoveItem方法更改TrackableCollection类(由自跟踪T4模板生成)并添加以下代码时,它的工作方式与我预期的一样:

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

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

不,这是不正确的。人与数之间存在多对多关系。您应该严格区分删除关系(仅从连接表中删除记录)和删除项本身,您不应该自动执行此操作,因为删除编号可能会影响到许多其他您目前不合作的人(此外,如果没有级联删除,则在这种情况下会出现异常)


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

谢谢您的回复。这不是一个多对多的关系。它是一对多(从人到数字)。我的问题始于我将一个人的号码绑定到WPF数据网格。当一个数字从datagrid中删除时,它应该从DB中删除。我不想在每个datagrid行删除事件上手动调用MarkAsDelete。找出这种情况(在一对多导航中删除)并调用MarkAsDeleted怎么样?好吧,我理解你的描述。整个enity框架中的行为都是相同的(不好的)——这不仅仅是自跟踪实体的问题。从集合中删除实体只会破坏关系。唯一的例外是特殊类型的(但我不确定它是否以与STE相同的方式工作)。将
MarkAsDeleted
放在模板中是危险的,因为这也会影响多对多关系。你应该手动调用
MarkAsDeleted
got!谢谢。我将考虑创建一个定制的DataGrid来处理这个问题。