我可以在Linq TO Sql中使用嵌套的DataContexts吗?

时间:2009-08-29 19:00:05

标签: linq-to-sql

在GetData3()方法中创建另一个datacontext会导致问题吗?

  public void SetoFDataMethods()
  {
    using (DataContext DC= new DataContext())
    {

        var d1=DC.GetData1();
        var d2=DC.GetData2();
        var d3=DC.GetData3();

        display(d3);

    }
  }


  public result GetData3()
   {
        If (conditionA)
        {
               using (DataContext newContext=new DataContext())
               {
                    var result= newContext.GetData4();
                   return result;
               }
        }        
   }

4 个答案:

答案 0 :(得分:3)

不,我认为它不一定会产生问题,但它可能会造成混乱。每个上下文都是独立的,除非你明确地编写代码,否则不会共享事务。我做了类似的事情,我使用多个数据上下文,一个用于审计,另一个用于实际数据,但它们是分开的,甚至不映射同桌。

我的建议是将数据上下文提升一级 - 从方法到类 - 因此类中的所有方法都可以共享相同的数据上下文。我没有这样做的原因是我明确地希望将事务分开,以便我可以通过审计实用程序记录失败和成功。在我共享相同数据上下文的地方,我确实在实例级而不是方法级使用它。

推动上下文的一个优点是,如果需要进行单元测试,可以轻松注入模拟上下文。在方法中创建数据上下文会使单元测试变得困难,因为您没有简单的方法将其与实际数据库隔离开来。我在一段时间后使用包装器发布了一个blog entry来模拟/伪造LINQ数据上下文,如果你走这条路可能会有所帮助。

答案 1 :(得分:1)

请注意,从一个上下文中检索到的对象与该上下文相关联,除非您做了相反的明确魔术。就目前情况而言,试图从一个上下文中删除一个对象而不是从中检索一个对象会抛出异常。

答案 2 :(得分:1)

我建议您将DataContext作为参数发送并使用相同的DataContext。

答案 3 :(得分:1)

默认情况下不容易。您必须分离绑定到上下文的实体才能在另一个数据上下文中使用它们。一个简单的解决方案就是创建一个工作单元模式。