【问题标题】:Entity Framework Cascading Deletes & Lazy Loading实体框架级联删除和延迟加载
【发布时间】:2012-02-22 10:00:07
【问题描述】:

我正在使用 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();
  • 我在订单 - 订单详情中有一个(一对多)关联,级联删除。 (如果我删除一个Order,所有具有相同OrderID的Order_Details都会被删除)。

  • 我启用了延迟加载

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

为什么会这样?延迟初始化不应该为我“包含” Order_Details,并最终让我级联删除吗?

【问题讨论】:

  • 不。根据我的经验,级联删除仅适用于内存对象。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 2011-03-14
        • 1970-01-01
        相关资源
        最近更新 更多