删除与SQL Server和ASP.NET MVC的多对多关系的最佳实践

时间:2015-04-22 08:51:50

标签: sql-server asp.net-mvc triggers relationships

我正在使用链接到SQL Server数据库的Entity Framework处理ASP.NET MVC中的项目,我使用SQL Server Management Studio来管理。

我有一些多对多的关系,我用一个链接其他两个表的中间表来处理。让我们说我有表A,表B和表A_B,它们以多对多的关系链接A和B.

如果我想删除表A中的一行,我必须删除表B中与其链接的所有行,因此删除A_B中的行。

我的问题是

在这种情况下,最佳做法是什么?我应该在MVC ASP.NET中的控制器中处理那些删除,还是我必须使用SQL Server触发器来处理它?

对我来说,只使用触发器并从控制器本身抽象出所有这些逻辑看起来会更清晰,所以我只需要删除表A中的行,而下部控制杆(SQL Server)将处理其余部分

但是,我听说有人说我们应该避免使用SQL Server中的触发器,所以在商业项目中,你会推荐哪种方法作为最佳实践?

感谢。

修改

[表A [id]] - > [表A_B [id_A,id_B,位置]]< - [表B [id]]

我的情况(我无法发布图片)。我试图在每个关系上放置Cascade,但是当我删除A中的一行时,A_B中的相应行被删除但不是B中的相应表。有没有办法做到这一点?或者在这种情况下我必须使用触发器?

1 个答案:

答案 0 :(得分: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来访问您的数据库。