实体框架DeleteObject子项

时间:2009-08-31 21:37:15

标签: entity-framework

使用EF删除对象(及其子对象)的最佳方法是什么?我想只传递要删除的对象的id,并让EF句柄删除其依赖数据(外键数据)。我是否必须首先根据id检索对象,然后调用“DeleteObject”?

1 个答案:

答案 0 :(得分:8)

如果您在数据库中配置了级联,那么删除原则就足够了。

您可以在不查询数据库的情况下执行此操作,以使用如下的Stub实体获取要删除的内容:

var stub = new Principal{ID = idToDelete};
ctx.AttachTo("PrincipalsEntitySetName", stub);
ctx.DeleteObject(stub);

当然,如果有用于并发检查的引用或字段,那么这也不是全部故事。

另一方面,如果模型中只有级联删除(即数据库中没有级联),则需要首先获取内存中的所有依赖项,然后调用delete:

var stub = new Principal{ID = idToDelete};
ctx.AttachTo("PrincipalsEntitySetName", stub);
stub.Dependendents.Load();
ctx.DeleteObject(stub);

这只能起作用,因为EF会发出冗余删除事件,以使ObjectContext与数据库中预期的内容保持同步。

希望这有帮助

亚历

PS我在MSDN博客上有关于此主题的tips。查看tip 33(级联删除)和tip 26(存根实体)