編譯的查詢: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
謝謝,我用這之前玩,我總是得到「結果後,從查詢返回的數據上下文選項不能被修改。」 反正這個查詢是相對於多個地方使用與其他查詢(選擇或更新),因此我會害怕設置跟蹤。 – 2010-03-18 21:03:42
致@Michael D.Irizarry:你如何在同一個dataContext上打開/關閉跟蹤?我得到「從查詢返回結果後無法修改數據上下文選項。」如果嘗試在CUD操作後將跟蹤設置爲false。 – mipe34 2012-11-10 22:52:44