Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Удаление записи через Entity Framework


Автор: cha0ss 8.10.2009, 16:04
Здравствуйте, у меня есть структура из 3 таблиц:

таблица заказчик c 2 связями: 1 к таблице Физ.лицо, 2 к таблице Юр.лицо

Столкнулся сразу с несколькими проблемами:
1. Делаю выборку 1 заказчика (выбираю по ID). Получаю объект ЗАКАЗЧИК, но поля FizLico и UrLico у него NULL. Почему?
Код:
Код

EstateUOEntities6 euo = new EstateUOEntities6();
var q2 = from c in euo.zakazchik
              where c.ID == "200"
              select c;

т.е c.FizLico = null, хотя в базе есть Физ.лицо, присоединенное к заказчику.

2. Пытаюсь удалить FizLico по ID
Код

EstateUOEntities6 euo = new EstateUOEntities6();
var q2 = from c in euo.FizLico
              where c.OID == "001"
              select c;
FizLico p = q2.First();
euo.DeleteObject(p);
euo.SaveChanges();


Вылетает следующая ошибка:
{"The DELETE statement conflicted with the REFERENCE constraint \"FK_zakazhik_FizLico\". The conflict occurred in database \"db1\", table \"dbo.zakazhik\", column 'FizLico'.\r\nThe statement has been terminated."}

Entity Framework разве не может удалить FizLico, если на текущую запись есть ссылка с таблицы zakazhik. Разве он не должен автоматом изменить zakazhik.FizLico на null?

Автор: cha0ss 9.10.2009, 14:57
Нашел некоторое решение второй проблемы:

Сначала выбрал заказчика и присвоил св-ву FizLico null, после удаляю Физ.Лицо из базы.
Получается нечто вроде этого:

Код

EstateUOEntities6 euo = new EstateUOEntities6();
var q2 = from c in euo.zakazchik
              where c.ID == "200"
              select c;

zakazchik z = q2.First();
z.FizLico = null;
euo.SaveChanges();

var q2 = from c in euo.FizLico
              where c.OID == "001"
              select c;
FizLico p = q2.First();
euo.DeleteObject(p);
euo.SaveChanges();


Но вопрос собственно остается, разве Entity Framework не может следить за связями самостоятельно?

Автор: cha0ss 12.10.2009, 08:14
Неужели никто не стакливался с данной проблемой, или так мало поклонников Entity Framework?

Автор: cha0ss 13.10.2009, 09:36
Вообщем наткнулся на то, что каким образом будет удаляться запись / записи зависит не от Entity Framework, а от свойств связи в самой SQL.

Вот выдержка из статьи с МСДН'а (http://msdn.microsoft.com/ru-ru/library/ms188066(SQL.90).aspx)

Цитата

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } 

Указывает, какое действие производится над строками изменяемой таблицы, если эти строки связаны ссылкой, и строка, на которую имеется ссылка, удаляется из родительской таблицы. Параметр по умолчанию — NO ACTION.
NO ACTION

Компонент SQL Server Database Engine инициирует ошибку, и производится откат операции удаления строки родительской таблицы.
CASCADE

Если из родительской таблицы удаляется строка, соответствующие ей строки удаляются из ссылающейся таблицы.
SET NULL

Все значения, составляющие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в значение NULL. Для выполнения этого ограничения столбцы внешних ключей должны допускать существование значений NULL.
SET DEFAULT

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


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

Код

EstateUOEntities6 euo = new EstateUOEntities6();
var q2 = from c in euo.zakazchik
              where c.ID == "200"
              select new { zakazchik = c, fizlico= c.FizLico};


P.S Если кто откопает как можно сделать лучше, пишите буду рад любым соображениям.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)