簡體   English   中英

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

[英]Linq-to-sql Compiled Query returns object NOT belonging to submitted 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映射到DB的POCO。

更新:看起來下一個鏈接描述了類似的問題(此錯誤已解決嗎?): http : //social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/9bcffc2d-794e-4c4a-9e3e-cdc89dad0e38

您可以嘗試將上下文的ObjectTrackingEnabled設置為false。 這在相同的情況下對我有幫助,但后來我在更新和插入記錄時將其打開。

DBDataContext.ObjectTrackingEnabled = false; // Read Only

這是一個錯誤,無法修復。

在以下鏈接的帖子中描述了類似的問題。 我嘗試不按建議在編譯查詢中使用PK,但遇到了同樣的問題。 因此,編譯查詢繞過緩存存在問題。

LINQ to SQL實體身份緩存和已編譯查詢錯誤的解決方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM