首页 > 解决方案 > 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);
}

标签: c#entity-framework-core

解决方案


从外观上看,您似乎正在尝试删除已经有子项的行,我的意思是被其他实体引用的行。你已经指定OnDelete: NoAction了这意味着当你删除他们当前引用的行时,其他表的行会出现问题。您可以做的是在删除该行之前先删除所有相关实体。例如,如果您尝试删除 bazaDanychId 为 7 的实体。您想检查它是否被Rozkla...表中的其他行引用

var rozks = _context.RozklaJazdyKMs.Where(r = r.bazaDanychId == 7);
_context.RozklaJazdyKMs.RemoveRange(rozks);
_context.SaveChanges();

然后您可以安全地删除该bazaDanych实体,因为引用它的实体现在已被删除。

另一种方法和正确的做法是简单地配置CascadeOnDeleteDelete


推荐阅读