Entity Framework 6'da çoklu zaman uyumsuz mu?


87

Bu benim kodum:

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

Ama işlevi denetleyiciden çağırdığımda. Hata gösterdi

Önceki bir eşzamansız işlem tamamlanmadan önce bu bağlamda ikinci bir işlem başlatıldı. Bu bağlamda başka bir yöntemi çağırmadan önce zaman uyumsuz işlemlerin tamamlandığından emin olmak için 'await' kullanın. Herhangi bir örnek üyesinin iş parçacığı açısından güvenli olduğu garanti edilmez.

Lütfen bu sorunu çözmeme yardım edin.


2 görevim var. Her görevi çalıştırırsam. başarı. ama yukarıdaki kodum gibi çalıştırırsam. Hata
Bir Hv

Yanıtlar:


119

İstisna, her bağlamda izin verilen yalnızca bir eşzamansız işlem olduğunu açıkça açıklar.

Öyleyse, awaithata mesajının da önerdiği gibi, onlara birer birer sahip olmalısınız :

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();

Veya birden çok bağlam kullanabilirsiniz:

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);

35
sadece bir not, eğer beklemede olsa bile sorguda bağlamı kullanan bir Lazy değişkeniniz varsa, aynı hatayı atacaktır, sadece özelliği sorgudan önce alın, bunu bulmak acı vericiydi.
Pedro.The.Kid

7
@ Pedro.The.Kid: Genel bir kural olarak, eşzamansız DB erişimi ile tembel yüklemeyi kullanmayın. Geç yükleme her zaman eşzamanlıdır, bu nedenle ek veriler için Dahil et veya ayrı sorguları kullanmak çok daha iyidir.
Stephen Cleary

1
Eşzamansız sorgu başına bir bağlama ihtiyaç duymanızın belirli bir nedeni var mı? Bunun oldukça sınırlayıcı bir faktör haline geldiğini hissediyorum.
Zapnologica

1
@Zapnologica: ES6'nın tasarlandığı yol bu. Her bağlam tek sorgu işleyebilir bir anda . Dolayısıyla, bir sorguyu bir sonraki başlamadan önce bitirirseniz, yalnızca bir bağlama ihtiyacınız olur. Aynı anda birden çok sorgu yapmak istiyorsanız bu yalnızca bir sorundur.
Stephen Cleary

@StephenCleary, istisnadan hemen önce hiçbir şey olmadığından bu sorguyu bulmakta zorlanıyorum. Şu anda neyin infaz edildiğini bulmamızın bir yolu var mı? Teşekkürler
Fabio Milheiro


3

Örneğin depo kalıbı ile bağımlılık ekleme için Unity kullanırsanız, create / update / delete ile iki veya daha fazla bağlamı kullanarak aşağıdaki hatayı alırsınız:

İki nesne arasındaki ilişki, farklı ObjectContext nesnelerine eklendiğinden tanımlanamaz.

Bu, kullanılarak çözülebilir PerRequestLifetimeManager. Daha fazla bilgi burada:

C # EF6, Unity - Asp.Net Web Api kullanarak bir bağlama birden çok zaman uyumsuz çağrı yapar

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.