2011-07-06 93 views
0

我使用實體框架與.NET 4.0和SQL Server 2008刪除父FK約束的實體在實體框架與SQL Server的

我有兩個實體ABA有許多B的(有a字段B表,即B→多對一→A)。當我嘗試刪除特定父實體A時,查詢失敗

A是父實體,B是子實體。

下面是我用一個特定A實體刪除代碼: -

var obj = (from A in context.As where A.id=someValue select A).First(); 
context.As.DeleteObject(obj); 
context.SaveChanges(); 

但是它拋出著名的例外

DELETE語句衝突與基準約束「FK_bs_as」 。數據庫「myDb」,表「dbo.bs」,列「a」發生衝突。

該聲明已終止。

然後我看了看使用SQL Server Management Studio中的外鍵約束和編輯FK如下:

  • 刪除規則:級聯
  • 更新規則:級聯
  • 強制執行外鍵約束:否

並試圖將FK設置爲​​ON DELETE CASCADE。但顯然還是有問題的。

我不想獲取父實體(A)的每個該死的子實體(B)並單獨刪除它們。與執行單個SQL查詢相比,這太昂貴了。

回答

4

你需要做的是:

  • 設置在數據庫中刪除規則像你一樣(沒有設置更新規則,但不改變強制約束!)上刪除規則
  • 設置上EDMX中的關係

如果您的相關實體未加載,第一步將確保級聯刪除將起作用,並且第二步將確保級聯刪除將在您的相關實體加載時起作用。兩個步驟都是必要的。

完成此操作後,不需要加載相關實體並逐個刪除它們。

+0

那沒用。我按照你所說的改變了FK,並更新了'.edmx'文件中的刪除規則,如下所示:End1 B(1),End1 onDelete:cascade; End2:A(*),End2 onDelete:無。它不起作用。我不能在end2(A)上放置級聯,它會拋出錯誤。 –

0

確保您的實體模型與數據庫模型同步。每次更改數據庫(從數據庫更新模型)時刷新實體模型,否則可能會發生意外的異常。

0
  • 集A和B OnDelete之間的關聯Cascade在EDMX
  • 從模型生成數據庫
  • 使用新model.edmx.sql重新創建數據庫
  • 與您的數據填充數據庫
  • 再試一次