【问题标题】:Entity Framework "detach without deletion" for filtering用于过滤的实体框架“分离而不删除”
【发布时间】:2012-01-27 19:24:16
【问题描述】:

我遇到了实体框架和过滤架构的问题。

假设我有几个相关的实体,我想根据过滤器对它们进行一些更改。

所以,例如,我有 Orders 和 Orderlines(举一个简单的例子) 我有order1,数据库中有orderline1、orderline2、orderline3关系

然后我收到 order1 的更新请求,但仅针对 orderline1 和 orderline3 我使用实体框架从数据库中获取数据,该框架检索订单及其行的对象图。

有没有办法过滤这些实体对象,以便我可以使用包含 order1 和 orderline1 和 orderline3 但不是 orderline2 的对象图,以后不会出现问题? 因为如果我从实体集合中删除 orderline2,我稍后会遇到并发错误(或删除的实体,这是我不想要的)

我希望问题很清楚,我知道可能有其他方法(迭代而不是在 orderline2 上执行更新,因此它保持不变并且没有进行任何更改)但是架构的制作方式不允许我现在就去做。

如果我可以说“不再跟踪对 orderline2 的任何更改,只需忽略我对这个特定对象和后代所做的任何更改,只需将其保留在数据库中即可”,这样我就可以删除它从收藏中继续前进,那将是完美的

谢谢!

【问题讨论】:

  • 我认为如果你使用 Detach 删除实体,它不会被删除...

标签: c# .net entity-framework entity-framework-4


【解决方案1】:

您也可以采取多种方式,正如您已经描述过的那样:

  1. 遍历所有订单行并仅修改需要修改的那些(但正如您所说,这不是一个选项)
  2. 在 ObjectStateManager 负责更改跟踪的“正常”EF 情况下(据我所知),您描述的不跟踪 orderline2 更改的替代方案是不可能的。在具有自我跟踪实体的场景中,这更容易,因为每个 STE 都有自己独特的 ChangeTracker,可以轻松关闭。
  3. 但最简单的选择是在“选择”语句或实体检索中排除您不想修改的订单行。比如:

private void ModifyOrderLines(int orderID, List<int> orderlineIds)
{
  using(Context context = new Context)
  {
    List<OrderLines> orderlines = 
    context.OrderLines.
    Where(orderLine => orderLine.OrderID == orderID && orderlineIDS.Contains(orderLine.ID))   
  } 
}

假设您已设置干净的外键关系,这些关系已转换为 EF 中的导航属性。因此,您要做的是获取属于某个订单的 OrderLine 列表,并在需要修改的 OrderLine 列表中有一个 ID。

之后,您更改订单并将更改应用到上下文并调用 SaveChanges。这只是你如何做事的基本方式。我不知道你的确切设置,但我希望这会有所帮助。

编辑

根据您的评论,我应该采用简单的方法并按照您的建议编写一个循环。为什么不?我不认为有很多替代方案,如果有的话,它们会使事情变得过于复杂。

所以这样的事情可能会起作用:

ObjectContext.OrderLines.ForEach(o => if(orderlineIds.Contains(o.ID) {o.SomeProperty = SomeValue}));

或者您可以自己编写循环。

EDIT2

您已经在帖子标题中提到了与 ObjectContext 分离。那为什么不走那条路呢?您告诉您无法控制您获得的 ObjectContext,它被传递给多个方法,并且您获得某些实体的更新请求。然后分离那些更新请求不需要的实体也是一种选择。也许this topic on MSDN 可能会帮助您做出决定。之后,您可能会再次附加分离的对象,因为后续“客户端”调用可能需要它们。但这取决于您如何管理 ObjectContext。

您是在多个“客户端”调用中保持 ObjectContext“活动”,还是为特定的客户端调用一遍又一遍地实例化它。我没有完全弄清楚情况......

【讨论】:

  • 不想做我写的代码的代码块。有人能做到吗?
  • 该方法的问题在于方法需要对象图,而在这里您正在执行查询以获取订单线。我过度简化了这个案例,但想象一下我们有订单和内部和内部的更多东西,我们正在更新所有实体中的属性
  • 嘿!没那么简单。对象图进入几个业务逻辑方法,这些方法循环集合及其相关实体,检查多个位置的属性,在多个位置进行更改。是的,我可以将一个 ID 列表传递给所有方法,并在每次循环每个集合时进行一些手动过滤,但这意味着要进行大量重构,这是我试图避免的,因为该功能已经工作了跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多