为什么要使用 TrackableCollection不调用已删除项目的 MarkAsDeleted 方法?
我在 WPF 组合中使用 Self-Traking 实体时遇到问题。
我有两个实体集例如:人和数字。每个人有很多号码,很多号码可以有一个人。
这是我期望删除号码的示例代码:
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 类中。这是一个好方法吗?
I have a problem when using the Self-Traking Entities in compination of the WPF.
I have two entity set for exmaple: People and Numbers. Each person has many numbers and many numbers can have a person.
Here the sample code which I expect a number deletion:
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();
}
It doesn't delete the number from DB.
When I change the TrackableCollection class (Which generated by the Self-Tracking T4 templates) by overriding the RemoveItem method and add the following code, it works as I expected:
protected override void RemoveItem(int index)
{
var entity = ((IObjectWithChangeTracker)this[index]);
base.RemoveItem(index);
entity.MarkAsDeleted();
}
Is it correct to I put the MarkAsDeleted method here? So I should change the TT file to put this code in the TrackableCollection class. Is it a good approach?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,这是不正确的。人和数字之间存在多对多关系。您应该严格区分删除关系(仅从联结表中删除记录)和删除项目本身,并且您不应该自动执行此操作,因为删除数字可能会影响您目前不与之合作的许多其他人(而且没有级联删除)在这种情况下你会得到例外)。
如果您想删除关系并删除项目,请手动调用
MarkAsDeleted
。此外,如果不付出更大的努力,您的更改将影响模型中的所有实体,这不是您想要的。No it is not correct. You have many-to-many relation between person and number. You should strictly differ between removing relation (deleting record only from junction table) and between removing item itself and you should not make this automagically because removing number can affect many other persons which you don't work with at the moment (moreover without cascade deletes you will get exception in such case).
If you want to remove relation and delete item call
MarkAsDeleted
manually. Moreover without bigger effort your change will affect all entities in the model which is not what you want.