如何在实体框架中从另一个上下文中删除项目?

时间:2018-04-26 22:57:04

标签: c# entity-framework

EssaieFilament是我数据库中表格的名称。

注意:我从法语中翻译了错误消息,因此可能不完全正确。

您好,我填写了一个" EssaieFilament"的列表,然后将列表发送到一个删除它们的函数,但随着上下文的变化,它会给我一个错误。

  

L'异常System.InvalidOperationException发生了   HResult = 0x80131509消息=无法删除对象,因为它不可能   在ObjectStateManager中找到。源=的EntityFramework

有没有办法解决这个问题而不必实际发送上下文?

public static void SupprimerEssaieFilament(List<EssaieFilament> essaieFilament_list)
{
    using (var context = new tp2_1608469Entities1())
    {
        foreach (EssaieFilament essaieFilament in essaieFilament_list)
        {
            context.EssaieFilaments.Remove(essaieFilament);
            context.SaveChanges();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

它不会像这样工作。您正在打开一个新的上下文(与DataBase的连接),但您检索的实体属于另一个连接(第一个方法中的那个,您查询过它们)。

您应该将上下文发送到方法,或者发送Id的列表,当您打开新上下文时,检索实体,然后删除(或者您想要做的任何事情)它们。

答案 1 :(得分:0)

在这种情况下,您可以使用.AttachTo执行某些操作,您可以将实体列表附加到新上下文中,然后将其删除。

您还可以重新查询新上下文并删除找到的项目。这将比您示例中的代码执行得更好,因为您在一次调用中一次删除所有项目,而不是在集合中每次删除一次。

public static void SupprimerEssaieFilament(List<EssaieFilament> essaieFilament_list)
{
    using (var context = new tp2_1608469Entities1())
    {
        var itemIds = essaieFilament_list.Select(x=>x.Id);
        var itemsToDelete = context.EssaieFilaments.Where(x=>itemsIds.Contains(x.Id));

        context.EssaieFilaments.RemoveRange(itemsToDelete);
        context.SaveChanges();
    }
}

答案 2 :(得分:-1)

如果上下文发生变化,您必须在删除之前检查上下文中要删除的 .ui-sortable-placeholder { display:inline-block; height: 1px; } 对象是否存在 ...所以试试这个:

essaieFilament