C# 用于筛选的实体框架“分离而不删除”

C# 用于筛选的实体框架“分离而不删除”,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我在实体框架和过滤架构方面遇到了问题 假设我有几个相关的实体,我想基于过滤器对它们进行一些更改 举个简单的例子,我有订单和订单行 我在数据库中有order1、orderline1、orderline2和orderline3关系 然后,我收到order1的更新请求,但仅针对orderline1和orderline3 我使用实体框架从数据库获取数据,实体框架检索订单及其行的objectgraph 有没有一种方法可以过滤这些实体对象,这样我就可以使用包含order1、orderline1和orderl

我在实体框架和过滤架构方面遇到了问题

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

举个简单的例子,我有订单和订单行 我在数据库中有order1、orderline1、orderline2和orderline3关系

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

有没有一种方法可以过滤这些实体对象,这样我就可以使用包含order1、orderline1和orderline3,但不包含orderline2的objectgraph,而以后不会出现问题? 因为如果我从entitycollection中删除orderline2,我以后会遇到并发错误或删除的实体,这是我不想要的

我希望问题是清楚的,我知道还有其他方法可以迭代和不在orderline2上执行更新,所以它保持不变,没有做任何更改,但架构的方式不允许我现在这样做

如果我可以说不要再跟踪对orderline2的任何更改,只需忽略我对这个特定对象和子体所做的任何更改,只需按原样将其保留在DB中,这样我就可以将其从集合中删除并向前移动,那就太完美了


谢谢

您也可以按照自己的描述走多种路:

迭代所有订单行,只修改那些需要修改的订单行,但这不是您所说的选项 据我所知,在ObjectStateManager负责变更跟踪的正常EF情况下,您描述的不跟踪orderline2变更的替代方案是不可能的。在具有自跟踪实体的场景中,这更容易,因为每个STE都有自己独特的ChangeTracker,可以轻松关闭。 但最简单的选择是在select语句或实体检索中排除您不想修改的订单行。比如: 或者你可以自己写循环

编辑2

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


您是让ObjectContext在多个客户端调用中保持活动状态,还是为特定的客户端调用反复实例化它。我没有完全弄清楚情况…

我认为如果您使用Detach取消对实体的访问,它将不会被删除…我不想为我编写的代码创建代码块。任何人都能做到这一点?这种方法的问题在于,这些方法需要objectgraph,而在这里,您要做的是一个查询,以获取订单行。我过分简化了这个案例,但是想象一下,我们有订单,里面有订单行和更多的东西,我们正在更新所有实体中的属性嘿!不是那么简单。objectgraph进入两个业务逻辑方法,这些方法循环集合及其相关实体,在多个位置检查属性,在多个位置进行更改。是的,我可以将ID列表传递给所有方法,并在每次循环每个集合时进行一些手动筛选,但这意味着要进行大量重构,这是我试图避免的,因为该功能已经起作用了
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))   
  } 
}
ObjectContext.OrderLines.ForEach(o => if(orderlineIds.Contains(o.ID) {o.SomeProperty = SomeValue}));