ADO.NET Entity Framework: Как получить автоматическое каскадное удаление? - PullRequest
4 голосов
/ 30 мая 2009

Я использую Ado.Net Entity Framework с ASP.NET MVC.

В моей базе данных MSSQL 2008 у меня есть, например, следующие упрощенные таблицы и отношения:

 (Song) 1--* (Version) 1 -- 1 (VersionInfo)

Можно ли автоматически удалять связанные Версии и их VersionInfo при удалении Песни?

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

  db = new Database() //Entities
  Song song = db.Song.First();

  Song.Version.Load();

  foreach(Version version in Song.Version.ToList())
  {
       //Remove Song-Version Reference.
       song.Version.Remove(version);


       //Get The VersionInfo so we can delete it after we deleted the Version object.
       version.VersionInfoReference.Load();
       VersionInfo versionInfo = version.VersionInfo;

       //Now we can delete the Version Object.
       db.DeleteObject(version);
       //Now we can also delete the versionInfo, since the reference is gone.
       db.DeleteObject(versionInfo);

  }

  db.DeleteObject(song);

Должен быть более простой способ получить каскадные удаления. Я уже пытался установить параметр отношения в MSSQL для Cascade при удалении, но ничего не вышло ... Я что-то там пропустил?

В любом случае, как другие люди решают эту проблему?

Ответы [ 4 ]

2 голосов
/ 31 мая 2009

Вы не должны делать это в Entity Framework. Все популярные реляционные базы данных поддерживают ON CASCADE DELETE для внешних ключей, что также намного эффективнее. Я предлагаю вам просто пойти с этим.

В вашем случае может возникнуть необходимость каскадного удаления из песни в версию и из версии в информацию о версии. Просто загрузите конструктор таблиц в SQL Manager, и вы должны увидеть соответствующие параметры в отношениях.

1 голос
/ 31 мая 2009

Я попробовал это с более простой базой данных, 2 таблицами и обнаружил, что каскад только с 1 стороны от 1-многих.

table A
id  - int
b_id - int 

table B
id - int

Установлена ​​связь между A.b_id и B.id. Правило удаления каскадное.

Когда я удаляю A, B не удаляется. Когда я удаляю B, A удаляется.

Проблема в том, что я хочу удалить B при удалении A. Я думаю, это возможно только вручную.

0 голосов
/ 28 мая 2011

в окончательной первоначальной версии EF, выберите отношение в конструкторе, нажмите F4, чтобы увидеть свойства. вы увидите два свойства OnDelete (по одному для каждой стороны отношения), для которых установлено значение "none". Вы можете установить любую из сторон в "каскад" (я думаю, что вы должны установить его на родительском)

0 голосов
/ 30 мая 2009

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

Например, есть ли еще какие-то отношения, которые также необходимо каскадировать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...