コンパイルされたクエリ:
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 から読み込まれています。
もう 1 つの重要な情報は、このテストが TransactionScope の下にあることです (ただし、トランザクションがなくても問題が発生しています)。
XMLを使用してDBにマップされたPOCOを使用しています。
更新: 次のリンクで同様の問題が説明されているようです (このバグは解決されていますか?): http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/9bcffc2d-794e-4c4a-9e3e-cdc89dad0e38