2012-04-10 22 views
127

Oturumda çalışan başka konu olduğundan yeni işleme izin verilmiyor. Bunun neden kırılabileceğine dair herhangi bir fikir var mı? Oturumda LINQ To Entity

foreach (var p in pp) 
{ 
    ProjectFiles projectFile = (ProjectFiles)p; 
    projectFile.Status = Constants.ProjectFiles_ERROR; 
    projectFile.DateLastUpdated = DateTime.Now; 
    context.SaveChanges(); 
} 

ben geçici çözüm sorunu, foreach döngüsünde önce tek seferde sonuçlar almak için olduğunu okudum.

Bunu yapmadım mı? "pp", benim durumumdaki sonuçların koleksiyonudur

+10

'pp' bir linq sorgusunun sonucu mu? Eğer öyleyse, döngüsünü çalıştırmadan önce veritabanından çıkarmak için bir 'ToList()' yapmanız gerekebilir. – SouthShoreAK

+0

Evet öyle. Tamam Ben –

+2

çağrı kaydetme değişiklikleri denemek deneyeceğim. Önerilen düzeltme, muhtemelen, her kaydetme işleminde sürekli olarak yeni işlemlere başlamak için EF'yi durdurarak çalışır. Ancak, EF'de bir meseleye işaret ediyor. Buradaki mantık muhtemelen doğru değil. Bir döngüye kaydetmeden önce bir işlem başlatmanız ve ardından tümünü veya tümünü geri almanız gerekir. Tabii ki bu istenen mantık değil. – Mohsin

cevap

321

pp değişkeni, nesnelerin bir koleksiyonu değildir, nesneleri döndürebilen bir numaralandırıcıdır. Numaralayıcıyı kullanırken kaynak açık kalmalıdır.

Numaralandırmayı bir koleksiyona dönüştürmek için ToList yöntemini kullanın. Bu, numaralandırıcıdaki tüm öğeleri okuyacaktır ve bağlantıyı kaynağa kapatacaktır, böylece bağlantıyı başka şeyler için kullanabilirsiniz. Sonra değişiklikleri kaydetmek için başka bağlantısı kullanarak, db varlıkların topluluğu üzerinde yineleme için bir SQL bağlantısı kullanarak olduğunuzu neler oluyor

foreach (var p in pp.ToList()) 
+14

Tanrı sizi korusun @Guffa !!! +1 –

+2

Harika! Aynı zamanda pp.ToArray() –

+2

Ricardo ile çalışır, IQueryable –

7

olduğunu. Bu, sınıflarınızın temelde db bağlantınızın bir örneğine "evli" olduğu ve başka biri tarafından değiştirilemediği için olur.

Bunun üstesinden gelmenin bir yolu, yinelemeden önce koleksiyonunuzda .ToList() öğesini çağırmaktır.

Ve işteyken, kodu hızlandırmak için döngüden çıktıktan sonra yalnızca context.SaveChages() numaralı telefonu arayın.