在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类中。这是一个好方法吗?
答案 0 :(得分:2)
不,这不对。你和人之间有多对多的关系。删除关系(仅删除联结表中的记录)和删除项目本身之间应该严格区别,并且不应自动进行此操作,因为删除数字可能会影响您目前不使用的许多其他人员(此外没有级联删除你会在这种情况下得到例外)。
如果您要删除关系并手动删除项目调用MarkAsDeleted
。此外,如果没有更大的努力,您的更改将影响模型中不是您想要的所有实体。