Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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
C# 在不使用Alter命令的情况下,删除级联行_C#_Asp.net_Sql - Fatal编程技术网

C# 在不使用Alter命令的情况下,删除级联行

C# 在不使用Alter命令的情况下,删除级联行,c#,asp.net,sql,C#,Asp.net,Sql,我必须删除一个产品及其图像。图像位于单独的表中,productId充当外键。 下面是执行此操作的单个查询 string deleteImages = @"DELETE FROM [ProductsImages] WHERE ProductId IN (SELECT ProductId FROM [Products] WHERE ProductId = @ProductId)"; string deleteProduct = @"DELETE FROM [Products] WHERE Produ

我必须删除一个产品及其图像。图像位于单独的表中,productId充当外键。 下面是执行此操作的单个查询

string deleteImages = @"DELETE FROM [ProductsImages] WHERE ProductId IN (SELECT ProductId FROM [Products] WHERE ProductId = @ProductId)";
string deleteProduct = @"DELETE FROM [Products] WHERE ProductId = @ProductId";
       db.ExecuteNonQuery(deleteImages);
       db.ExecuteNonQuery(deleteProduct);  

我无法避免编写两个不同的查询,在不使用alter命令的情况下删除cascade是否有帮助?

这是您可以在数据库中定义的内容。只需将Products和ProductsImage之间的外键关系定义为“ON DELETE CASCADE”。删除产品将自动删除所有关联的ProductImages。

如果不想更改索引,可以通过在一个命令中执行多个操作来避免两次往返:

string deleteStuff = @"
  DELETE FROM [ProductsImages] WHERE ProductId = @ProductId;
  DELETE FROM [Products] WHERE ProductId = @ProductId;"
db.ExecuteNonQuery(deleteStuff);
编辑
SQL Server不支持

为什么一个查询或两个查询都很重要?@Arran,用于学习,它可以改进我的编码风格:)这是真的,但也许应该谨慎对待-我工作过的大多数地方都希望删除是显式的,以防止意外的(非计划的)删除-他们希望删除失败(FK冲突)并修复删除代码。虽然不同团队的情况有所不同。是的,但看看他们是如何从Productimages中删除的:
WHERE ProductId IN(从[Products]WHERE ProductId=@ProductId
中选择ProductId)。我建议他们在数据库中手动操作的次数越少越好。呵呵,我不能怪你的推理!(我的临界强迫症迫使我在写我的答案时解决了这个问题)级联变成了一个“多么好的主意,我们将为我们所有的FK打开它”。然后一次删除之后……数据就消失了……)@Twinkles!thanx,是的,我们也可以手动完成。我通过查询学习:)SQL Server说:“*”附近的
语法不正确。
;更一般地说,是单表目标。
DELETE p.*, i.*
FROM Products p
LEFT JOIN ProductImages i ON p.ProductId = i.ProductId
WHERE p.ProductId = @ProductId