简体   繁体   English

ON DELETE NO ACTION时如何在EF Core中删除表中的行?

[英]How to delete row in table in EF Core when ON DELETE NO ACTION?

I tried to delete row in datagrid but I noticed that in my database my foreign keys are set ON DELETE NO ACTION so many examples from the internet didn't work.我试图删除数据网格中的行,但我注意到在我的数据库中,我的外键设置为 ON DELETE NO ACTION,所以互联网上的许多示例都不起作用。 In every row in datagrid I have a delete button.在 datagrid 的每一行中,我都有一个删除按钮。 Whenever I click on it I get an error每当我点击它时,我都会收到错误消息

SqlException: The DELETE statement conflicted with the REFERENCE constraint "ulice_idprzystanku_fkey". SqlException:DELETE 语句与 REFERENCE 约束“ulice_idprzystanku_fkey”冲突。 The conflict occurred in database RozklaJazdyKM...冲突发生在数据库 RozklaJazdyKM...

Is there any other solution to delete the rows?有没有其他解决方案来删除行?

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);
}

The code is from Microsoft docs:代码来自微软文档:

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);
}

By the looks of it, it seems you are trying to delete a row that already has children, I mean a row which is referenced by other entities.从外观上看,您似乎正在尝试删除已经有子项的行,我的意思是被其他实体引用的行。 You have specified OnDelete: NoAction That means it would be a problem for the rows of other tables when you delete the row they currently reference.你已经指定了OnDelete: NoAction这意味着当你删除它们当前引用的行时,它会对其他表的行产生问题。 What you can do is to delete all the related entities first before deleting that row.您可以做的是在删除该行之前先删除所有相关实体。 For example, if you're trying to delete a bazaDanych entity with an Id of 7. You want to check if it is referenced by other rows in the Rozkla... table例如,如果您尝试删除 ID 为 7 的bazaDanych实体。您想检查它是否被Rozkla...表中的其他行引用

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

Then you can safely delete the bazaDanych entity since the entities referencing it are now deleted.然后您可以安全地删除bazaDanych实体,因为引用它的实体现在已被删除。

The other way and right thing to do is to simply configure CascadeOnDelete to Delete另一种正确的做法是简单地将CascadeOnDelete配置为Delete

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM