Удалить объект и связанные с ним объекты - PullRequest
2 голосов
/ 18 марта 2010

Кто-нибудь знает, как удалить объект и все связанные с ним объекты.

Например, у меня есть таблицы Product, Category, ProductCategory и productDetails, productCategory объединяет таблицы Product и Category.

Я прочитал с http://msdn.microsoft.com/en-us/library/bb738580.aspx, что

Удаление родительского объекта также удаляет все дочерние объекты в стесненные отношения. Этот результат аналогичен включению CascadeDelete свойство в ассоциации для отношений.

Я использую этот код:

Product productObj = this.ObjectContext.Product.Where(p => p.ProductID.Equals(productID)).First();

if (!productObj.ProductCategory.IsLoaded)
    productObj.ProductCategory.Load();

if (!productObj.ProductDetails.IsLoaded)
    productObj.ProductDetails.Load();

//my own methods.
base.Delete(productObj);
base.SaveAllObjectChanges();

Но я получаю сообщение об ошибке ObjectContext.SaveChanges(); То есть,

Отношение добавляется или удаляется из AssociationSet 'FK_ProductCategory_Product'. С ограничениями по количеству элементов, соответствующая «ProductCategory» также должна быть добавлена ​​или удалена.

Ответы [ 4 ]

7 голосов
/ 19 марта 2010

Спасибо за ответ. Я решил свою проблему. Используя тот же каскад в EDMX. Для объяснения я отвечаю на свой вопрос. :)

Мы должны добавить <OnDelete Action="Cascade"></OnDelete> в файл EDMX двумя порциями

  1. В части SSDL
  2. В CSDL-части
5 голосов
/ 18 марта 2010

Взгляните на этот вопрос .
Там описан случай одноуровневой ассоциации. Если вы правильно настроили действие OnDelete, не должно быть проблем с удалением всех связанных дочерних объектов.

3 голосов
/ 01 мая 2012

Кроме того, если вы посмотрите на файл edmx в Visual Studio, вы можете выбрать «ассоциацию», выбрать свойство «End1 OnDelete» и установить «Каскад».

0 голосов
/ 06 августа 2012

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

...