Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除与SQL Server和ASP.NET MVC的多对多关系的最佳做法_Sql Server_Asp.net Mvc_Triggers_Relationships - Fatal编程技术网

Sql server 删除与SQL Server和ASP.NET MVC的多对多关系的最佳做法

Sql server 删除与SQL Server和ASP.NET MVC的多对多关系的最佳做法,sql-server,asp.net-mvc,triggers,relationships,Sql Server,Asp.net Mvc,Triggers,Relationships,我正在ASP.NET MVC中进行一个项目,使用链接到SQL Server数据库的实体框架,我使用SQL Server Management Studio来管理该数据库 我使用一个中间表处理一些多对多关系,该中间表链接其他两个表。假设我有表A、表B和表A_B,它们以多对多的关系连接A和B 如果我想删除表a中的一行,我必须删除表B中与其链接的所有行,从而删除a_B中的行 我的问题是: 在这种情况下,最佳做法是什么?我应该在MVC ASP.NET的控制器中处理这些删除,还是必须使用SQL Serve

我正在ASP.NET MVC中进行一个项目,使用链接到SQL Server数据库的实体框架,我使用SQL Server Management Studio来管理该数据库

我使用一个中间表处理一些多对多关系,该中间表链接其他两个表。假设我有表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,position]如果您真的想强制SQL Server删除引用,您不应该使用触发器,因为这是一种更明显的方法。您应该在创建外键时打开它

如果已经创建了外键,请先删除它

ALTER TABLE dbo.B
ADD CONSTRAINT FK_A_B_Cascade
FOREIGN KEY (AId) REFERENCES dbo.A(Id) ON DELETE CASCADE
但最好在代码中设置删除逻辑。因为并非所有情况下都要删除引用。有时候最好设置一些标志,如IsDeleted为true


此外,最好不要在控制器中执行此操作,而是创建单独的DAL数据访问层项目并将其放置在那个里。可能是您想使用其中一种ORM访问数据库。

您也可以使用。没有最佳实践。这取决于各种因素谢谢,我尝试将级联规则应用于删除操作,问题是:当我删除a中的一行时,a_B中的行被删除了,但B中的行没有。请提醒a对B没有外键,B对a没有外键,所有内容都由表A_B映射。我再次阅读了您的答案,当尝试在数据库上实现它时,我开始注意到我可能想得太多了,可能这更像是一个设计问题。对于这一点,级联规则应该足够了。谢谢你的帮助,也谢谢你在DAL中编写逻辑的技巧。没问题。如果它对你有帮助-接受它作为一个答案,你可以检查一下我对主要问题的编辑。我认为现在情况更清楚了。不要使用触发器——这就是我的建议。触发器在将来不容易维护。只需将该逻辑放在删除记录的存储过程中。