2015-04-22 40 views
1

我正在使用實體框架鏈接到SQL Server數據庫,我使用SQL Server管理工作室來管理。刪除與SQL Server和ASP.NET MVC的多對多關係的最佳做法

我有一些多對多的關係,我用一個鏈接兩個其他表的中間表來處理。假設我有表A,表B和表A_B,它們將A和B鏈接成多對多的關係。

如果我想刪除表A中的一行,我必須刪除表B中與它鏈接的所有行,因此刪除A_B中的行。

我的問題是

什麼是在這種情況下,最好的做法是什麼?我是否應該在MVC ASP.NET中的控制器中處理這些刪除操作,還是必須使用SQL Server觸發器來處理這些操作?

對我來說,使用觸發器並從控制器本身抽象所有這些邏輯看起來會更乾淨,所以我只需要刪除表A中的行,而較低的控制桿(SQL Server)會照顧休息。

但是,我聽到有人說我們應該避免在SQL Server中觸發器,所以在一個商業項目中,您會推薦哪種方法作爲最佳實踐?

謝謝。

編輯:

[TABLE A [ID] - > [TABLE A_B [ID_A,ID_B,位置] < - [TABLE B [ID]

這是我的情況(我目前無法發佈圖片)。我試圖在每個關係上放置刪除Cascade,但是當我刪除A中的一行時,A_B中的對應行被刪除,但不是B中對應的表。有沒有辦法做到這一點?或者在這種情況下,我必須使用觸發器?

+2

你也可以使用[級聯刪除](http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server)。沒有最佳做法。這取決於各種因素 – Liam

回答

0

如果你真的想強制SQL Server刪除引用你應該使用CASCADE DELETE非觸發器,只是因爲它是更明顯的方式來做到這一點。您應該在FOREIGN KEY創建時打開它。

如果您已經創建了FOREIGN KEY,請先放下它。

ALTER TABLE dbo.B 
ADD CONSTRAINT FK_A_B_Cascade 
FOREIGN KEY (AId) REFERENCES dbo.A(Id) ON DELETE CASCADE 

但是在代碼中設置刪除邏輯要好得多。因爲在所有情況下都不想刪除引用。有時候最好只設置一些標誌,如IsDeletedtrue

此外,最好不要在Controller中這樣做,但要創建單獨的DAL(數據訪問層)項目並將其放置在那裏。並且可以是您想要使用ORM之一如Entity Framework來訪問您的數據庫。

+0

謝謝,我試圖將級聯規則應用到Delete操作,問題是: 當我刪除A中的一行時,A_B中的行被刪除,但不是B中的行。提醒A沒有外鍵給B,而B沒有外鍵給A,所有內容都由表A_B映射。 –

+0

我再次讀到你的答案,並試圖在數據庫上實現時,我開始注意到,我可能會過度這一點,也許這是更多的設計問題。級聯規則對此應該足夠了。感謝您的幫助,以及編寫DAL邏輯的提示。 –

+0

沒問題。如果它可以幫助你 - 接受它作爲答案 –

相關問題