实体框架级联删除&延迟加载

时间:2012-01-30 15:59:30

标签: c# entity-framework lazy-loading cascading-deletes

我正在使用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对多)关联,级联删除。 (如果我删除一个订单,将删除具有相同OrderID的所有Order_Details)。

  • 我启用了LazyLoading

如果我删除了from子句中的.Include("Order_Details"),则级联删除无法正常工作。

为什么会这样?不是懒惰的初始化应该"包括" Order_Details对我来说,最终让我级联删除?

3 个答案:

答案 0 :(得分:5)

级联删除在EF模型中定义。

因此,EF将为已加载的数据生成删除语句。 EF不会去数据库检查它应删除的内容。

您可以在数据库级别定义级联删除(取决于您的数据库)。在这种情况下,EF将删除顶级节点,数据库将删除相关的行。

答案 1 :(得分:1)

您是否在数据库和实体配置中定义了级联删除?我已经看到只有一个定义它的地方,而另一个不能导致这个问题。

答案 2 :(得分:1)

EF模型中的级联删除仅删除已在上下文中加载的细节。如果你确实使用Include Order_Details在查询期间加载Orders。如果您启用了LazyLoading而不使用Include,则会根据需要加载它们,即引用导航属性时。 因此,如果您不关心细节并同意使用主记录静默删除它们,则必须在EF模型和数据库模式中定义级联删除。