Entity Framework Cascading Удаляет и Ленивая Загрузка - PullRequest
5 голосов
/ 30 января 2012

Я использую образец базы данных Northwind. У меня есть этот код:

var db = new NorthwindEntities();
int id = 2; // Example
var delObject = (from o in db.Orders.Include("Order_Details")
                 where o.OrderID == id
                 select o).First();
db.Orders.DeleteObject(delObject);
db.SaveChanges();
  • У меня есть (1-ко-многим) связь в Заказе - Детали заказа, с каскадным удалением . (Если я удалю один ордер, все ордера Order_Details с одинаковым идентификатором ордера будут удалены).

  • У меня LazyLoading включен .

Если я удалю .Include("Order_Details") в предложении from, каскадное удаление не будет работать.

Почему это происходит? Разве ленивая инициализация не должна «включать» Order_Details для меня и в конечном итоге позволять мне каскадно удалять?

Ответы [ 3 ]

5 голосов
/ 30 января 2012

Каскадные удаления определены в вашей модели EF.

Поэтому EF сгенерирует операторы удаления для данных, которые он загрузил. EF не пойдет в базу данных, чтобы проверить, что следует удалить.

Вы можете определить каскадное удаление (в зависимости от вашей базы данных) на уровне базы данных. В этом случае EF удалит верхний узел, а база данных удалит соответствующие строки.

1 голос
/ 31 января 2012

Каскадное удаление в модели EF удаляет только те детали, которые были загружены в контексте.В случае, если вы используете Включить Order_Details загружаются во время запроса вместе с заказами.Если вы включили LazyLoading и не используете «Включить», они загружаются по мере необходимости, т.е. когда вы ссылаетесь на свойства навигации.Таким образом, если вы не заботитесь о деталях и согласны с тем, что они будут автоматически удалены с основной записью, вы должны определить каскадное удаление как в модели EF, так и в схеме БД.

1 голос
/ 30 января 2012

Есть ли у вас каскадное удаление, определенное как в базе данных, так и в конфигурации объекта? Я видел, где это может быть определено только в одном, а в другом не может вызвать эту проблему.

...