我正在使用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对我来说,最终让我级联删除?
答案 0 :(得分:5)
级联删除在EF模型中定义。
因此,EF将为已加载的数据生成删除语句。 EF不会去数据库检查它应删除的内容。您可以在数据库级别定义级联删除(取决于您的数据库)。在这种情况下,EF将删除顶级节点,数据库将删除相关的行。
答案 1 :(得分:1)
您是否在数据库和实体配置中定义了级联删除?我已经看到只有一个定义它的地方,而另一个不能导致这个问题。
答案 2 :(得分:1)
EF模型中的级联删除仅删除已在上下文中加载的细节。如果你确实使用Include Order_Details在查询期间加载Orders。如果您启用了LazyLoading而不使用Include,则会根据需要加载它们,即引用导航属性时。 因此,如果您不关心细节并同意使用主记录静默删除它们,则必须在EF模型和数据库模式中定义级联删除。