Entity.SaveChanges () также сохраняет удаленный объект BindingList?

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

Я пишу приложение для выставления счетов в winform.

У меня есть сетка на форме с источником данных, установленным на объект BindingList.

Давайте просто это примерно так:

BindingList<InvoiceLine> MyInvoiceLines = new BindingList<InvoiceLine> { };

Invoice MyInvoice = new Invoice();

И InvoiceLine, и Invoice являются объектами сущностей в моей модели.

Я добавляю линии в сетку с помощью:

MyInvoiceLines.Add(new InvoiceLine());

Я удаляю строки из сетки с помощью:

MyInvoiceLines.Remove(LineToBeRemoved);

Где LineToBeRemoved - это свойство, которое получает выбранную строку, когда при использовании требуется удалить строку и т. Д.

В конце концов, я хочу сохранить счет, поэтому я делаю это ...

 foreach(var line in MyInvoiceLines)
{
   MyInvoice.InvoiceLines.Add(line);
}

а затем вызывает SaveChange (). Однако строки, которые были удалены из InvoiceLines BindingList, также сохраняются ... Я чешу голову, пытаясь решить это, поскольку NO WHERE в моем коде от начала до конца ссылается на коллекцию InvoiceLines или была связана с контекстом данных объект перед этим методом, который в конечном итоге выполнит сохранение.

Это упрощенная версия моего кода, но я не могу избавиться от мысли, что я должен что-то концептуально ошибиться либо с BindingList, либо с объектом контекста данных. Для меня это действительно не очевидно, поскольку я новичок.

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

Обновление: отсоединение элемента перед добавлением в BindingList, казалось бы, исправлено, но удаление объекта из объекта имеет странное поведение: / всем спасибо.


person Rillanon    schedule 19.12.2011    source источник
comment
Отправьте свой код и сообщите нам, где возникает ошибка и при каких условиях.   -  person Ben Robinson    schedule 19.12.2011
comment
Извините, я слишком рано нажал кнопку "Отправить". Я обновил ОП. Сообщите мне, если вам потребуется дополнительная информация.   -  person Rillanon    schedule 19.12.2011
comment
Вы проверяли, действительно ли MyInvoiceLines.Remove(LineToBeRemoved) работает и MyInvoiceLines в вашем цикле foreach действительно больше не содержит удаленных элементов?   -  person Slauma    schedule 19.12.2011


Ответы (5)


Вы можете попробовать удалить объект явно. т.е.

foreach(var object in deletedObjectCollection)
{
     _currentContext.DeleteObject(order);
}

вместо того, чтобы полагаться на его отсутствие в коллекции, чтобы активировать удаление. По моему опыту (с EF4) это не работает. Я использую отложенную загрузку, и отсутствие объекта в коллекции может быть связано с тем, что он не был загружен, поэтому полагаться на его отсутствие кажется неправильным. Вероятно (почти наверняка) есть более элегантные способы сделать это, но в настоящее время он работает для меня.

Обычно мне приходилось делать с EF гораздо более явным образом, чем я бы хотел.

person Crab Bucket    schedule 19.12.2011
comment
Я попытался удалить явно, но теперь удаленный объект добавлен, а НЕ удаляется, что за фиг .... лол, может, пора все это переписать. - person Rillanon; 19.12.2011
comment
О нет, @Rillanon. Вы уверены, что у вас построены две коллекции, и вы удаляете нужную? очевидно - извините. Также - не очень красиво, но попробуйте вызывать saveChanges после каждого цикла удаления, чтобы посмотреть, помогает ли это. Вызов удаления объекта должен работать - person Crab Bucket; 19.12.2011
comment
Только что проверил еще раз ... нету всего одну коллекцию, это меня волнует :( Ну что ж, время ложиться спать, ночная ночь. Спасибо всем за помощь! - person Rillanon; 19.12.2011

Сущность, которая была удалена из BindingList, также была отключена от DBContext?

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

person ilivewithian    schedule 19.12.2011
comment
Я попытался вызвать entity.InvoiceLines.detach (LineToBeRemoved), но он все еще сохранен ... дело в том, что объект никогда не предназначался для прикрепления до метода сохранения. Перед этим происходит метод удаления. - person Rillanon; 19.12.2011

Я думаю, вам нужно установить один грязный флаг для неизмененной записи, а затем проверить его в событии Entity.SaveChages (). Может быть, это тебе поможет ...

person Manoj Savalia    schedule 19.12.2011

Вы делаете это несколько раз? Возможно, вы добавили все элементы InvoiceLine в свой Invoice, затем удалили некоторые из BindingList (не ваша фактическая сущность!), А затем повторно добавили их в свою сущность.

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

person Matthias Meid    schedule 19.12.2011

Если ваш Invoice объект является Entity объектом, он зависит от контекста и будет отслеживаться контекстом. Вызов SaveChanges() сохранит все изменения для всех Entity объектов, если они не отсоединены.

Имейте в виду, что если вы свяжете эти Entity объекты с графом объектов и присоедините любой узел графа объектов к контексту, будет присоединен весь граф. Итак, если вы создаете новый объект сущности, например InvoiceLine, и связываете этот новый InvoiceLine с графом объекта:

MyInvoiceLines.Add(new InvoiceLine());

на этом этапе весь график должен отслеживаться контекстом.

person Xacron    schedule 19.12.2011