我是一名仍在学习EF4错综复杂的开发人员。我很清楚如何下拉对象列表并在循环中迭代删除它们但是我不能让自己编写代码来执行n个记录时执行n个语句(和数据库往返)更新或删除。
一个典型的例子是在删除相关父记录之前删除子记录以保持参照完整性......(是的,我默认使用软删除但是幽默我)
在存储过程中,我只是执行SQL,如下所示:
DELETE FROM someChildTable WHERE ForeignTableId = @keyToGo
DELETE FROM parentTable WHERE Id = @keyToGo
在Linq To SQL中我会这样做:
dataContext.ChildrenTable.DeleteAllOnSubmit(from c in dataContext.ChildrenTable
where c.ParentTableId == keyToGo
select c);
dataContext.ParentTable.DeleteOnSubmit(parentToGo);
dataContext.SubmitChanges();
在NHibernate中我会这样做:
nhSession.CreateQuery("delete from ChildrenTable where ParentTable.Id = :keyToGo")
.SetInt32("keyToGo", keyToGo)
.ExecuteUpdate();
nhSession.Delete(parentToGo);
我已经找到了EF等效的任何一个没有成功。 我是否真的必须回退到存储过程才能在EF4的上下文中执行此操作? 我希望不是;请分享。
答案 0 :(得分:2)
EF是一个ORM - 对象关系映射器。将关系数据库中的行和列映射到.NET对象模型非常棒 - 这最适合读取,插入,更新一个或几个对象。
EF 不设计并打算作为处理大型操作的工具,不设计和优化以进行批量更新,批量删除等。这些处理得更好通过使用直接ADO.NET对数据库执行那些T-SQL命令,或者只是调用存储过程来完成工作。
所以在这种情况下,我可能会创建一个存储过程来处理删除操作,然后将存储过程导入到我的EF模型中,这样我就可以像调用EntityContext上的方法一样调用它,让SQL Server完成繁重的操作
答案 1 :(得分:1)
如果将父对象和子对象之间的关系设置为数据库中的“全部级联”,则需要从EF执行的操作是删除父对象。数据库将为您删除子对象(现在称为孤儿)。目前在EF中没有其他方法可以有效地做到这一点。
答案 2 :(得分:0)
如果您不想按照建议使用Cascade All,请查看 ObjectContext.ExecuteStoreCommand 函数,该函数允许对数据存储运行即席查询。 这很可能是执行批量删除或更新的最有效方式。