删除与 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
但最好在代码中设置删除逻辑。因为并非在所有情况下您都想删除引用。有时最好只设置一些标志,例如 IsDeleted
到 true
。
此外,最好不要在 Controller
中执行此操作,而是创建单独的 DAL(数据访问层)项目并将其放置在那里。并且可能是您想使用 ORM 之一,例如 Entity Framework 来访问您的数据库。
我正在 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
但最好在代码中设置删除逻辑。因为并非在所有情况下您都想删除引用。有时最好只设置一些标志,例如 IsDeleted
到 true
。
此外,最好不要在 Controller
中执行此操作,而是创建单独的 DAL(数据访问层)项目并将其放置在那里。并且可能是您想使用 ORM 之一,例如 Entity Framework 来访问您的数据库。