1

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

例如,我有两个实体集:人员和数字。每个人有很多数字,很多数字可以有一个人。

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

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 类(由 Self-Tracking T4 模板生成)并添加以下代码时,它按预期工作:

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

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

4

1 回答 1

2

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

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

于 2011-06-30T18:15:01.223 回答