컴파일 된 쿼리 :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
감사합니다, 나는 전에이 함께 연주하고 있었고, 난 항상 얻고 있었다 "결과가 쿼리에서 반환 된 후 데이터 컨텍스트 옵션을 수정할 수 없습니다 .." 어쨌든이 쿼리는 관계의 여러 곳에서 사용된다 다른 쿼리 (선택 또는 업데이트)와 함께 따라서 나는 추적을 설정하는 것이 두려워 할 것입니다. –
@Michael D.Irizarry : 동일한 dataContext에서 어떻게 추적을 켜고 끈다. 쿼리에서 결과가 반환 된 후 데이터 컨텍스트 옵션을 수정할 수 없습니다. " CUD 조작 후에 추적을 false로 설정하려고하면. – mipe34