c# - ON DELETE NO ACTION时如何在EF Core中删除表中的行?
问题描述
我试图删除数据网格中的行,但我注意到在我的数据库中,我的外键设置为 ON DELETE NO ACTION,所以来自互联网的许多示例都不起作用。在 datagrid 的每一行中,我都有一个删除按钮。每当我点击它时,我都会收到错误消息
SqlException:DELETE 语句与 REFERENCE 约束“ulice_idprzystanku_fkey”冲突。冲突发生在数据库 RozklaJazdyKM...
有没有其他解决方案来删除行?
private void DeletePrzystanek(przystanki przystanki)
{
//if (dni != null)
//{
var przystanek = (from p in bazaDanych.przystanki.Local
where p.idprzystanku == przystanki.idprzystanku
select p).FirstOrDefault();
foreach (var item in przystanek.relacje.ToList())
{
bazaDanych.relacje.Remove(item);
}
foreach (var item in przystanek.przejazdy.ToList())
{
bazaDanych.przejazdy.Remove(item);
}
bazaDanych.przystanki.Remove(przystanek);
bazaDanych.SaveChanges();
przystankiViewSource.View.Refresh();
//}
}
private void DeleteCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
przystanki p = e.Parameter as przystanki;
DeletePrzystanek(p);
}
代码来自微软文档:
private void Delete_Order(Order order)
{
var ord = (from o in context.Orders.Local
where o.OrderID == order.OrderID
select o).FirstOrDefault();
foreach (var detail in ord.Order_Details.ToList())
{
context.Order_Details.Remove(detail);
}
context.Orders.Remove(ord);
context.SaveChanges();
ordViewSource.View.Refresh();
}
private void DeleteOrderCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
Order obj = e.Parameter as Order;
Delete_Order(obj);
}
解决方案
从外观上看,您似乎正在尝试删除已经有子项的行,我的意思是被其他实体引用的行。你已经指定OnDelete: NoAction
了这意味着当你删除他们当前引用的行时,其他表的行会出现问题。您可以做的是在删除该行之前先删除所有相关实体。例如,如果您尝试删除 bazaDanych
Id 为 7 的实体。您想检查它是否被Rozkla...
表中的其他行引用
var rozks = _context.RozklaJazdyKMs.Where(r = r.bazaDanychId == 7);
_context.RozklaJazdyKMs.RemoveRange(rozks);
_context.SaveChanges();
然后您可以安全地删除该bazaDanych
实体,因为引用它的实体现在已被删除。
另一种方法和正确的做法是简单地配置CascadeOnDelete
为Delete
推荐阅读
- javascript - 查找具有条件的对象数组的最小值
- angular - 为什么枚举中不允许计算值?
- c - 我不断收到段错误,不知道为什么
- django - 外键模型值返回相同的值
- c# - 使用实体框架将 OrderDetail 添加到数据库
- mysql - Mysql lock table - 它在事务中是否只持有一个表锁?
- git - Git (on-prem) - TFS2013 - 如何创建和提交从 VS2019 到 TFS2013 的新项目(使用 Git)
- algorithm - 插入成功后如何停止递归?
- javascript - 在打字稿中递归更新嵌套对象中的值
- api - 我的组织有一个 SPO 站点,我想知道使用 API 访问我们站点的前 10 位用户