4

編譯的查詢:Linq-to-sql編譯查詢返回不屬於提交的DataContext的對象?

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; 
    } 

它看起來像編譯的查詢是從另一數據上下文返回結果

[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 
    } 
    } 

如果我運行其他的(複雜)的單元測試,我得到預期: 嘗試添加或添加一個不是新的實體,可能是從另一個DataContext加載的實體。

另一個重要的信息是,這個測試是在TransactionScope下(但即使沒有事務,問題也會出現)!

我正在使用使用XML映射數據庫的POCOs。

UPDATE: 它看起來像一個環節的描述類似的問題(是這個bug解決了嗎?): http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/9bcffc2d-794e-4c4a-9e3e-cdc89dad0e38

回答

1

你可以試試上下文的ObjectTrackingEnabled設置爲false。這有助於我在這種情況下,但我稍後在更新和插入記錄時將其打開。

DBDataContext.ObjectTrackingEnabled = false; // Read Only 
+0

謝謝,我用這之前玩,我總是得到「結果後,從查詢返回的數據上下文選項不能被修改。」 反正這個查詢是相對於多個地方使用與其他查詢(選擇或更新),因此我會害怕設置跟蹤。 – 2010-03-18 21:03:42

+0

致@Michael D.Irizarry:你如何在同一個dataContext上打開/關閉跟蹤?我得到「從查詢返回結果後無法修改數據上下文選項。」如果嘗試在CUD操作後將跟蹤設置爲false。 – mipe34 2012-11-10 22:52:44