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

Best practice for deleting many-to-many relationships with SQL Server and ASP.NET MVC

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

我有一些多对多关系,我使用一个中间 table 来处理,该中间 table 链接另外两个 table。假设我有 table A、table B 和 table A_B 以多对多关系链接 A 和 B。

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

我的问题是

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

对我来说,只使用触发器并从控制器本身抽象出所有这些逻辑会看起来更干净,所以我只需要删除 table A 中的行和较低的杠杆 (SQL服务器)会处理剩下的事情。

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

谢谢。

编辑:

[TABLE A [id]] -> [ TABLE A_B [id_A, id_B, 位置] ] <- [TABLEB[id]]

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

如果你真的想强制 SQL 服务器 删除引用你应该使用 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 来访问您的数据库。