Как я могу удалить элементы в одном контексте из другого в Entity Framework? - PullRequest
0 голосов
/ 27 апреля 2018

EssaieFilament - это имя таблицы в моей базе данных.

примечание: я перевел сообщение об ошибке с французского, поэтому оно может быть неточным.

Здравствуйте, я заполняю список «EssaieFilament», а затем отправляю список функции, которая их удаляет, но при изменении контекста это выдает ошибку.

Исключение 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 голосов
/ 27 апреля 2018

Так работать не будет. Вы открываете новый контекст (соединение с базой данных), но извлеченные вами сущности принадлежат другому соединению (то, что в первом методе, где вы их запросили).

Вы должны либо отправить контекст методу, либо отправить список идентификаторов, а когда вы откроете новый контекст, получите сущности, а затем удалите (или что вы хотите сделать) их.

0 голосов
/ 27 апреля 2018

Вы можете сделать что-то с .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();
    }
}
0 голосов
/ 27 апреля 2018

Если контекст изменяется, вы должны проверить, существует ли essaieFilament объект, который вы хотите удалить , в контексте, прежде чем удалять его ... Поэтому попробуйте это:

public static void SupprimerEssaieFilament(List<EssaieFilament> essaieFilament_list)
{
    using (var context = new tp2_1608469Entities1())
    {
        foreach (EssaieFilament essaieFilament in essaieFilament_list)
        {
            if (context.EssaieFilaments.Contains(essaieFilament))
            {
                context.EssaieFilaments.Remove(essaieFilament);
                context.SaveChanges();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...