Linq to sql Linq to sql编译查询返回的对象不属于提交的DataContext?

Linq to sql Linq to sql编译查询返回的对象不属于提交的DataContext?,linq-to-sql,datacontext,compiled-query,linq.compiledquery,Linq To Sql,Datacontext,Compiled Query,Linq.compiledquery,已编译查询: public static class Machines { public static readonly Func<OperationalDataContext, short, Machine> QueryMachineById = CompiledQuery.Compile((OperationalDataContext db, short machineID) => d

已编译查询:

   public static class Machines
   {
      public static readonly Func<OperationalDataContext, short, Machine>
          QueryMachineById = 
           CompiledQuery.Compile((OperationalDataContext db, short machineID) =>
           db.Machines.Where(m => m.MachineID == machineID).SingleOrDefault()
     );

     public static Machine GetMachineById(IUnitOfWork unitOfWork, short id)
     {
        Machine machine;

        // Old code (working)
        //var machineRepository = unitOfWork.GetRepository<Machine>();
        //machine = machineRepository.Find(m => m.MachineID == id).SingleOrDefault();

        // New code (making problems)
        machine = QueryMachineById(unitOfWork.DataContext, id);

        return machine;
     }
公共静态类机器
{
公共静态只读函数
QueryMachineById=
CompiledQuery.Compile((OperationalDataContext数据库,短machineID)=>
其中(m=>m.MachineID==MachineID).SingleOrDefault()
);
公共静态机器GetMachineById(IUnitOfWork unitOfWork,短id)
{
机器;
//旧代码(工作)
//var machineRepository=unitOfWork.GetRepository();
//machine=machineRepository.Find(m=>m.MachineID==id).SingleOrDefault();
//新代码(制造问题)
machine=QueryMachineById(unitOfWork.DataContext,id);
返回机;
}
看起来编译后的查询正在从另一个数据上下文返回结果

  [TestMethod]
  public void GetMachinesTest()
  {
     using (var unitOfWork = IoC.Get<IUnitOfWork>())
     {
        // Compile Query
        var machine = Machines.GetMachineById(unitOfWork, 3);
        // In this unit of work everything works… 
        // Machine from repository (table) is equal to Machine from compile query.
     }

     using (var unitOfWork = IoC.Get<IUnitOfWork>())
     {
        var machineRepository = unitOfWork.GetRepository<Machine>();

        // Get From Repository
        var machineFromRepository = machineRepository.Find(m => m.MachineID == 2).SingleOrDefault();
        // Get From COmpiled Query
        var machine = Machines.GetMachineById(unitOfWork, 2);

        VerifyMachine(machineFromRepository, 2, "Machine 2", "222222", ...);
        VerifyMachine(machine, 2, "Machine 2", "222222", ...);

        Assert.AreSame(machineFromRepository, machine);       // FAIL
     }
  }
[TestMethod]
public void GetMachinesTest()
{
使用(var unitOfWork=IoC.Get())
{
//编译查询
var machine=Machines.GetMachineById(unitOfWork,3);
//在这个单位的工作中,一切都是正常的…
//存储库(表)中的计算机等于编译查询中的计算机。
}
使用(var unitOfWork=IoC.Get())
{
var machineRepository=unitOfWork.GetRepository();
//从存储库获取
var machineFromRepository=machineRepository.Find(m=>m.MachineID==2.SingleOrDefault();
//从编译查询中获取
var machine=Machines.GetMachineById(unitOfWork,2);
验证机器(machineFromRepository,2,“机器2”,“222222”,…);
验证机器(机器,2,“机器2”,“222222”,…);
Assert.arame(machineFromRepository,machine);//失败
}
}
如果我运行其他(复杂)单元测试,我会得到预期的结果: 尝试附加或添加非新实体,可能是从另一个DataContext加载的实体。

另一个重要信息是,此测试在TransactionScope下进行(但即使没有事务,问题也会出现。)

我使用的是使用XML映射到DB的POCOs

更新: 看起来下一个链接描述了类似的问题(这个错误解决了吗?):

您可以尝试将上下文的ObjectTrackinEnabled设置为false。这在相同的情况下对我有所帮助,但我后来在更新和插入记录时将其打开

DBDataContext.ObjectTrackingEnabled = false; // Read Only

谢谢,我以前玩过这个,我总是得到“在查询返回结果后无法修改数据上下文选项…”总之,这个查询与其他查询(用于选择或更新)在多个位置使用因此,我会害怕设置跟踪关闭。对于@Michael D.Irizarry:如何在相同的dataContext上打开/关闭跟踪?我得到“查询返回结果后无法修改数据上下文选项”。如果在CUD操作后尝试将跟踪设置为false。