2010-12-01 33 views
2

我是一名開發人員,仍然在學習EF4的複雜性。我很清楚如何下拉對象列表,並在循環中迭代刪除它們,但是我無法自己寫一些代碼來執行n條記錄(和數據庫往返)更新或刪除。是否可以使用EF4執行高效的多行DELETE或UPDATE?

一個經典的案例,這是之前刪除相關父記錄,以保持參照完整性。(是的,我使用軟刪除默認,但幽默我)

在存儲過程中我刪除子記錄ð只是執行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

我不知道EF所以不能回答你的問題,但對於NHibernate,你只需打開Cascade All或Cascade Delete就可以了,而且無需爲孩子創建查詢就可以處理它關係。 – Phill 2010-12-01 02:54:47

回答

2

EF是一個ORM - 對象關係映射器。將關係數據庫中的行和列映射到您的.NET對象模型非常棒 - 這對於閱讀,插入,更新一個或幾個對象來說效果最佳。

EF是設計旨在處理大型作業工具,它設計和優化做批量更新,批量刪除等。這些都是通過或者使用直ADO.NET來執行處理的要好得多那些針對數據庫的T-SQL命令,或者通過調用存儲過程來完成這些工作。

所以在這種情況下,我可能會創建一個存儲過程來處理刪除操作,然後將該存儲過程導入到我的EF模型中,這樣我就可以將它稱爲EntityContext上的方法,並讓SQL Server執行重吊裝。

1

如果您將父對象和子對象之間的關係設置爲數據庫中的「級聯全部」,則只需從EF中刪除父對象即可。子對象(現稱爲孤兒)將由數據庫爲您刪除。目前在EF中沒有其他方法可以高效地完成此操作。

+0

級聯更新和刪除是數據庫端功能。這是否需要根據EF定義? – Tahbaza 2010-12-01 17:55:18

0

如果您不想按照建議使用Cascade All,請查看ObjectContext.ExecuteStoreCommand函數,該函數允許針對數據存儲運行臨時查詢。 這很可能是執行批量刪除或更新的最有效方式。

相關問題