Entity Framework'teki tembel yükleme işleminin yalnızca ObjectContext
'u oluşturan iş parçacığından çalıştığını öğrendim. Sorunu açıklamak için, sadece 2 öğeyi içeren basit bir modelle basit bir test yaptım: Person
ve Address
. İşte kod:Entity Framework temkinli yükleme işlemi diğer threaddan çalışmıyor
private static void TestSingleThread()
{
using (var context = new TestDBContext())
{
foreach (var p in context.Person)
{
Console.WriteLine("{0} lives in {1}.", p.Name, p.Address.City);
}
}
}
private static void TestMultiThread()
{
using (var context = new TestDBContext())
{
foreach (var p in context.Person)
{
Person p2 = p; // to avoid capturing the loop variable
ThreadPool.QueueUserWorkItem(
arg =>
{
Console.WriteLine("{0} lives in {1}.", p2.Name, p2.Address.City);
});
}
}
}
TestSingleThread
yöntem gayet iyi çalışıyor, Address
mülkiyet lazily yüklenir. Ancak,numaralı dosyada, p2.Address
boş olduğundan p2.Address.City
üzerinde bir NullReferenceException
olsun.
Bu bir hata mı? Çalışması gereken yol bu mu? Eğer öyleyse, bununla ilgili herhangi bir belge var mı? Konuyla ilgili hiçbir şey bulamadım MSDN veya Google ...
Ve daha önemlisi, bir geçici çözüm var mı? (Diğer açıkça ... çalışan iş parçacığı LoadProperty
çağırmaktan daha)
Herhangi bir yardım çok
PS mutluluk duyacağız: VS2010 kullanıyorum, o EF 4,0 yüzden. EF'nin önceki sürümünde aynı olup olmadığını bilmiyorum ...
Motivasyonunuzdan emin değilim, ancak .NET takımı, iş parçacığı havuzunu açık bir şekilde kullanmak yerine Görev ve Eylemle yazılması için cesaret vermeyi amaçlıyor. Belki birisi bunun hakkında iyi bir alıntı yapabilir? –
'p2' kullanımı hakkında biraz bilgi verebilir misiniz? Sanırım hiçbir şey değiştirmedi mi? –
@jarrett: belki, ama sorun değil ... sorun zaten bir iş ile aynı olurdu, çünkü bu zaten konuları kullanır. @Henk: p2 olmadan da çalışmıyor, ama yine de gerekli, aksi halde her lambda aynı değişkeni kapatacaktı; Ayrıntılar için bu makaleye bakın: http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx –