2012-01-30 108 views
5

我正在使用罗斯文示例数据库。我有这样的代码:实体框架级联删除和延迟加载

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具有相同的OrderID将被删除)。

  • 我有懒惰加载启用

如果我删除from子句中的.Include("Order_Details"),级联删除将不起作用。

为什么会发生这种情况?是不是懒惰的初始化应该为我“包含”Order_Details,并最终让我级联删除?

+0

没有。根据我的经验,级联删除仅适用于内存对象。 – cadrell0 2012-01-30 16:05:56

回答

5

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

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

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

1

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

+0

确实,这使它工作,但为什么会发生? – ColdFusion 2012-01-30 16:35:06

1

EF模型中的级联删除仅删除已在上下文中加载的那些详细信息。如果您确实使用Include Order_Details,则会在查询期间与订单一起加载。如果启用LazyLoading而不使用Include,则会根据需要加载它们,即当您参考导航属性时。 因此,如果您不关心细节并且同意将它们用主记录悄悄删除,则必须在EF模型和数据库模式中定义级联删除。