2013-05-07 3 views
0

У меня есть таблица основных таблиц и подробностей. Например, основная таблица - ObjectSet<'MasterObject>, а таблица данных - ObjectSet<'DetailObject>. Таким образом, каждый MasterObject содержит EntityCollection<'DetailObject>. Как я понимаю, я могу удалить DetailObject из базы данных, используя следующий:Удалить элемент из БД с помощью EntityCollection.Remove()

  1. EntityCollection<'DetailObject> ec = masterObject.DetailObjects; // как свойства навигации
  2. ec.Remove(deleting_detail_object); // deleting_detail_object будет удален и помечается для удаления.
  3. context.SaveChanges(); // У меня есть исключение

После Remove() (свойство навигации) deleting_detail_object.MasterObject является null. Это нормально. Но context.SaveChanges() дать мне следующее исключение:

«Операция не удалась:. Отношения не могут быть изменены, потому что один или несколько внешних ключей свойств ненулевое Когда вносятся изменения отношения, связанное свойство внешнего ключа: установлено на нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойство внешнего ключа должно быть , которому присвоено другое ненулевое значение, или не связанный объект должен быть удален. "

я могу удалить это DetailObject с помощью context.RemoveObject(), но это можно сделать это с помощью EntityCollection<>?

ответ

0

Я не думаю, что эта проблема имеет какое-то отношение к EntityCollection, я думаю, что у вас есть проблема с вашей схемой базы данных. Если ваша основная таблица имеет FK для деталей, которые не являются нулевыми, вы не можете удалить строку таблицы подробностей, поскольку это нарушит вашу схему базы данных.

Либо измените его так, чтобы FK мог быть пустым или перепроектировать схему базы данных.

Если это операция, которую необходимо поддерживать, возможно, у вас должен быть FK в вашей таблице данных, ссылающейся на вашу основную таблицу. Таким образом, вы можете удалить подробные строки.

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

+0

У меня следующая ситуация (... ммм очень похожи): MasterTable: id_master_object (интермедиат PrimaryKey) master_object_name (NVARCHAR ...) DetailTable: id_detail_object (интермедиат PrimaryKey) id_master_object (внешний ключ к MasterTable) id_color (внешний ключ для Цвета) Две нормализованные таблицы с отношением ... очень простая и стандартная ситуация. – vchs

+0

Например, следующий код работает нормально: var deletingDetailObject = masterObject.DetailObjects.Single (s => s.id_detail_object == ...); context.DeleteObject (deletingDetailObject); контексте.Сохранить изменения(); // отлично, без исключения те же таблицы, тот же проект, тот же db ... я удивлен. Связь между MasterTable и DetailTable создается автоматически из существующего db. – vchs

+0

В предыдущем примере кода после EntityCollection << 'DetailObject >>. Remove (deletingDetailObject); deletingDetailObject.EntityState был изменен на Modified. Почему бы не удалить? MSDN сказал: после удаления (...) deletingDetailObject будет отмечен для удаления. Может быть, это неправильно (я имею в виду entitycollection.remove() -> context.savechanges())? Спасибо. – vchs

Смежные вопросы