Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление записи через Entity Framework 
V
    Опции темы
cha0ss
Дата 8.10.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.9.2009

Репутация: нет
Всего: нет



Здравствуйте, у меня есть структура из 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?
PM MAIL   Вверх
cha0ss
Дата 9.10.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.9.2009

Репутация: нет
Всего: нет



Нашел некоторое решение второй проблемы:

Сначала выбрал заказчика и присвоил св-ву 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 не может следить за связями самостоятельно?
PM MAIL   Вверх
cha0ss
Дата 12.10.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.9.2009

Репутация: нет
Всего: нет



Неужели никто не стакливался с данной проблемой, или так мало поклонников Entity Framework?
PM MAIL   Вверх
cha0ss
Дата 13.10.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.9.2009

Репутация: нет
Всего: нет



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

Вот выдержка из статьи с МСДН'а (http://msdn.microsoft.com/ru-ru/library/ms...66(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 Если кто откопает как можно сделать лучше, пишите буду рад любым соображениям.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.