2011-06-04 20 views
8

"Oturumda çalışan başka konu olduğu için yeni işleme izin verilmiyor".Oturumda çalışan başka konu olduğu için yeni işleme izin verilmiyor

Foreach döngülerinde veya insanların genellikle bu mesajla bağlantılı olarak sorunları olan herhangi bir şeyle ilgisi yoktur.

Bir depo deseni ve ortak bir içerik ile bir EF4 kullanıyorum istek boyunca açık. Bir şey olur, tam olarak neyi belirleyemezsiniz ve bu mesajı içeriğiyle, isteklerle karşılaştırmaya çalıştığım anda alırım ve yalnızca uygulama havuzunu geri dönüştürdüğümde ortadan kaybolur.

Bağlantıyı kapatıyorum mı? Nasıl söyleyebilirim? Her istek için yeni bir içerik kullanıyor muyum? Evet.

Neler oluyor? Bir iş var mı?

Düzenleme: (bağlam fabrikası)

private static Dictionary<string, CoinEntities> _instances; 

    public static CoinEntities DefaultInstance 
    { 
     get 
     { 
      if (HttpContext.Current == null) 
      { //todo: mock instead. testing. 
       if (!Instances.ContainsKey("_TEST")) 
        Instances["_TEST"] = new CoinEntities(); 
       return Instances["_TEST"]; 
      } 

      if (!Instances.ContainsKey("_DEFAULT")) 
       Instances["_DEFAULT"] = new CoinEntities(); 

      return Instances["_DEFAULT"]; 
     } 
    } 
+0

Dupe için http://stackoverflow.com/questions/2113498/sqlexception- varlık-çerçeve-yeni-işlem-izin verilmez-çünkü- – Korayem

cevap

16

Bunun sadece bertaraf edilmemiş bir bağlam sorunu olduğunu düşünmüyorum (içerik açılmamış işlemi tutmuyor - kabul edilmeyen değişiklikler nedeniyle bunu göreceksin). Bu soruna sahipseniz, büyük olasılıkla istek başına yeni içerik örneğini kullanmazsınız veya paylaşılan içerik örneğinde (= bir bağlantı) bazı çok iş parçacıklı/eşzamansız işlemleriniz vardır. Bu istisna, birden çok ileti dizisinin (muhtemelen birden çok işlenmiş istek) kendi işlemlerini aynı bağlantıda kullanmaya çalıştığını söylüyor; bu mümkün değil.

Köşe kasası, bağlamda sağlanan bağlantıların manüel olarak ele alınması olabilir, ancak bunu kullanırsanız, bundan bahsedersiniz.

Düzenleme:

Fabrikanız istek içeriği başına sağlamaz - tüm istek için tek bağlam sağlar !!! Bu statik sözlük tüm istekler arasında paylaşılır, böylece ilk örnek oluşturulur ve _DEFAULT anahtarının altına kaydedilir ve diğer tüm istekler bunu kullanır.

+0

Tüm reposları denetleyici kurucularında başlatıldı. Ve bilmediğim kadarıyla, farkında olmadan bir şey vermediğim sürece, çok iş parçacıklı bir işlemim yok. Ve çok sıkı bir şekilde kontrol ettiğim tek bir yer dışında manuel bağlantı işlemesi yok, çok nadiren denir - emin değilim. Yani, bunun beni nerede bıraktığını bilmiyorum. – Martin

+0

İşlemleri el ile mi yapıyorsunuz (TransactionScope)? Bu kapsamlar doğru şekilde doldurulmuş/imha edilmiş midir? –

+0

Tamam, depolar statik bir fabrika yönteminden sağlanır, ancak istekleri arasında nasıl hayatta kalacağını hala göremiyorum. Sağ? Ve bu yaş için böyleydi. – Martin

1

isteğiniz bittiğinde Sen bağlamı atmayın. Sen ... Bir kullanarak bloğu uygulayarak ya açıkça

using (var context = new MyContext()) 
{ 
    // Do Db stuff and SaveChanges, etc. 
} 
// context gets disposed automatically here 

... ya bağlamını imha edebiliriz:

context.Dispose(); 

(Yani şimdiye kadar giriş dayalı benim teorim.)

+0

istek bittikten sonra bağlam atılan değil mi? MCV'yi kullanma. Bu daha önce hiç olmamıştı, işte bu. Bir yıl süren gelişimden sonra başladı. Gerçekten hiçbir şey izleyemez. – Martin

+0

@Martin: Otomatik olarak atılmaz. Bir şekilde programlaman gerekiyor. MVC'deki denetleyicilerin üzerine yazabileceğiniz bir sanal 'Dispose 'yöntemi vardır. İstek işlendiğinde bu yöntem otomatik olarak çağrılır. Bağlamı atmak için iyi bir yerdir (denetleyicinin yapıcısında içeriği oluşturursanız). – Slauma

+0

Süper. Bunu yapacağım. – Martin

4

Yeni EF4 örtülü Transaction ile ilgili.

Bu, bir AsEnumerable() veya ObjectQuery Varlık isteğini açarken, bir işlemde olduğunuzu, bunun bir şekilde AsArray() sorgusundan kurtulmak için bir yol olduğunu ve artık işlemde olmadığınız anlamına gelir. Bir diğeri de iyimser kilitleme ile işlemi kapatarak olurdu? ama bulamıyorum. SqlException from Entity Framework - New transaction is not allowed because there are other threads running in the session

+0

açıklama için teşekkürler. Bu benim sorunum düzeltildi! – ra00l

0

bu kodu deneyin:

burada

onay .. bu benim çözüm

RespondableSites = model.HyperTextLinkEntitySets.OfType<Site>() 
         .Where(x => 
         (
          x.moz_RESPONSEDATA != null 
          && x.RowState.IndexOf("a=") < 0)) 
         ).ToArray(); 


foreach (var siteObj in RespondableSites) 
{ 
    using (var context = new brandshieldDBEntities()) 
    { 
     ParseResponseData(siteObj); 
     model.SaveChanges(); 
    } 
} 

olduğunu ve çalışmalarında, yavaş ama işe yarıyor.Yardımcı olabilir. Bu kodda, ben veritabanından kimlikleri hepsini almak ve ctx adlı veritabanı bağlamında yeni bir nesne ile üzerlerinden yineleme:

var listOfCourseId = db.Courses.Where(c => c.CourseStatus == 1).Select(c => c.CourseId); 
     using (var ctx = new UniversityDbContext()) 
     { 
      foreach (var acourseId in listOfCourseId) 
      { 
       Course selectedCors = new Course(); 
       selectedCors = ctx.Courses.Where(id => id.CourseId == acourseId).Single(); //hence use ctx.tableName instead of db.tableName 
       selectedCors.CourseStatus = 0; 
       ctx.Entry(selectedCors).State = EntityState.Modified; 
       ctx.SaveChanges(); 
      } 
     } 
İlgili konular