我正在使用链接到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中的相应表。有没有办法做到这一点?或者在这种情况下我必须使用触发器?
答案 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
但是在代码中设置删除逻辑要好得多。因为并非在所有情况下都要删除引用。有时候,只需设置IsDeleted
到true
之类的标记即可。
此外,最好不要在Controller
中执行此操作,而是创建单独的 DAL (数据访问层)项目并将其放在那里。您可以使用 ORM 之类的Entity Framework来访问您的数据库。