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에서로드되었을 가능성이있는 엔티티를 Attach 또는 Add하려고 시도했습니다.

또 다른 중요한 정보는이 테스트가 TransactionScope에 있다는 것입니다 (하지만 트랜잭션이 없어도 문제가 나타납니다).

XML을 사용하여 DB로 매핑 된 POCO를 사용하고 있습니다.

UPDATE : 다음 링크 유사한 문제를 설명한다처럼 보이는 (이 버그를 해결입니까?) : http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/9bcffc2d-794e-4c4a-9e3e-cdc89dad0e38

답변

1

버그이며 수정되지 않습니다.

비슷한 문제가 아래 링크의 게시물에 설명되어 있습니다. 필자는 제안 된대로 컴파일 된 쿼리에서 PK를 사용하지 않으려 고했지만 동일한 문제가 발생했습니다. 따라서 캐시를 우회하는 컴파일 된 쿼리에 문제가 있습니다.

Workaround for LINQ to SQL Entity Identity Caching and Compiled Query Bug?

1

false로 컨텍스트의 ObjectTrackingEnabled 설정을 시도 할 수 있습니다. 이것은 동일한 상황에서 나를 도왔지만 나중에 레코드를 업데이트하고 삽입하는 동안 그것을 켜는 것입니다.

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

감사합니다, 나는 전에이 함께 연주하고 있었고, 난 항상 얻고 있었다 "결과가 쿼리에서 반환 된 후 데이터 컨텍스트 옵션을 수정할 수 없습니다 .." 어쨌든이 쿼리는 관계의 여러 곳에서 사용된다 다른 쿼리 (선택 또는 업데이트)와 함께 따라서 나는 추적을 설정하는 것이 두려워 할 것입니다. –

+0

@Michael D.Irizarry : 동일한 dataContext에서 어떻게 추적을 켜고 끈다. 쿼리에서 결과가 반환 된 후 데이터 컨텍스트 옵션을 수정할 수 없습니다. " CUD 조작 후에 추적을 false로 설정하려고하면. – mipe34