Entity Framework — удаление объекта Split не прикреплено и не было загружено одним и тем же экземпляром контекста

У меня возникают проблемы при удалении отношения из структуры сущностей, когда я объявил отношение как разделенную таблицу.

По сути, мне нужен код, который будет проверять, был ли объект загружен в том же контексте. Проверка ниже не работает.

var data = new ProductItemData() { Id = pv.ProductItems[i].Id };

if (m_Context.ProductData.Where(w => w.Id == data.Id).Count() == 0)
{
   m_Context.ProductData.Attach(data);
}

m_Context.ProductData.Remove(data); 

Когда он не загружен в том же контексте, то есть данные были загружены из базы данных лениво, я правильно получаю эту ошибку

Объект не может быть удален, так как он не найден в ObjectStateManager.

И когда элемент находится в том же контексте и выполняется метод attach(). я получаю эту ошибку

Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом

Есть ли у кого-нибудь идея о проверке, которую я могу сделать?

Я думаю, что он игнорирует любые проверки, которые я делаю. Он отлично удаляет его, когда я перезагружаю контекст, но в том же контексте он всегда переходит к коду прикрепления.

Спасибо


person user3428422    schedule 16.06.2014    source источник


Ответы (2)


Если вы используете .ToList, вы заставляете среду выполнения активировать запрос sql (нетерпеливый способ).

Пытаться:

List<ProductData> data = m_Context.ProductData.Where(w => w.Id == data.Id).ToList();

if (data.Count() == 0)
{
   m_Context.ProductData.Attach(data);
}

m_Context.ProductData.Remove(data); 

И вместо присоединения вы можете попробовать следующее (взято из здесь):

context.Entry(oldEntity).CurrentValues.SetValues(newEntity);
person ilans    schedule 16.06.2014

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

if(m_Context.Entry(someEntity).State == EntityState.Detached)
{
    // entity was not added by this context or it is brand new and not added to a dbset
}

Вот различные значения для EntityState:

  • Добавлено: объект отслеживается контекстом, но еще не существует в базе данных.
  • Удалено: сущность отслеживается контекстом и существует в базе данных, но помечена для удаления из базы данных при следующем вызове SaveChanges.
  • Отсоединен: объект не отслеживается контекстом. Сущность находится в этом состоянии сразу после того, как она была создана с помощью оператора new или одного из методов DbSet Create.
  • Изменено: объект отслеживается контекстом и существует в базе данных, а некоторые или все значения его свойств были изменены.
  • Без изменений: объект отслеживается контекстом и существует в базе данных, а значения его свойств не изменились по сравнению со значениями в базе данных.
person Dismissile    schedule 16.06.2014
comment
Спасибо, это имеет смысл, однако я думаю, что он игнорирует любые проверки, которые я делаю (приведенный выше код соответствует норме). Он удаляет его нормально, когда я перезагружаю контекст, но в том же контексте он всегда переходит к коду присоединения, а затем к ошибкам. - person user3428422; 16.06.2014