6
Ben kuruluşların çok koleksiyon, birbiri peşi sıra değerlerini yeniden hesaplamak zorunda

çok fazla açma/kapama. Bu işlem sırasında Birçok sorguları ve aynı bağlantı

, bütün öz izleme-kuruluşlar aynı ObjectContext içinde değiştirilir. İşlenmesi gereken her varlık için, veriden küçük miktarlarda veri alınmalıdır. Bu, aynı SQL sorgusunun çoğuna neden olur, ancak farklı parametreler kullanır.

Veritabanına gönderilen sorguları izlemek için Solutions Design'ın ORM Profiler yazılımını kullanıyorum.

kendileri bana iyi görünüyor sorgular. Onlar kısa ve yürütmek için çok zaman alma.

Ancak, ben sorguları aslında nasıl işlendiğini Profilci beni nasıl gösterdiği konusunda karıştı: Gördüğünüz gibi

enter image description here

, bu açılış ve aynı veritabanı bağlantısını kapatma tutar. Şimdi

, tek Aç/Sorgu/Kapat bağlantı için zaman zaman bir göz atın:

enter image description here

Bu açılış ve bir veritabanı bağlantı atıklar kapanış saatinde benziyor.

this answer okuduktan sonra benim kod yüzden şimdi şöyle değiştirildi:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

Şimdi, bağlantısı hala hala aynı bağlantı (iyidir) kullandığını görürüz, ama sorgular arasında kapanmaya ve kendini açmaya devam ediyor.

Gert Arnold açıkça bağlamı kullanmadan önce bağlantıyı açmak önerdi. Daha sonra kodumu değiştirdim, bu şekilde göründüğü gibi:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    connection.Open(); 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

Artık çalışıyor! Her sorgu aynı veritabanı bağlantısı gönderilir:

enter image description here

Ben olarak şimdi merak ediyorum neden bağlamı kullanmadan önce bağlantıyı açmak gerekir?

+0

Bu bir kopya değil. Ben aslında aynı bağlantıyı tekrar kullanabilirim. Sorun, sorguların arasında kendini açmaya/kapatmaya devam etmesidir. –

+1

Bağlamı oluşturmadan önce bağlantıyı açtığınızda da kapanır mı? (Bu arada, kodunuzun tamamen doğru olmadığını düşünüyorum: "yeni EntityConnection" iki kez). –

+0

Çalışıyor! Ancak, önerdiğiniz gibi, bağlamı kullanmadan önce bağlantıyı açıkça açarsam. Neden biliyor musun ? –

cevap

4

Varolan bağlantısı olan bir bağlam oluşturmak mümkündür. Bu konuyla ilgili belgelerin bulunması zor, ancak bağlantı, içerik kullanılmadan önce açıkça açılırsa, açıkça kapatılana veya yok olana kadar açık kalacaktır. Bir F5'i ObjectContext (LINQPad kodu) ile test:

using (var conn = new EntityConnection(connectionString)) 
{ 
    conn.Open(); 
    using (var db = new InventoryContext(conn)) 
    { 
     db.Products.ToList(); 
     conn.State.Dump(); 
     db.SaveChanges(); 
     conn.State.Dump(); 
    } 
} 

çıkış OpenOpen olup. Bağlantı açılmaz zaman çıktı, ClosedClosed olduğunu.DbContext inşa edildiğinde

+0

Çok teşekkürler! Bağlamı kullanmadan önce bağlantıyı açıkça açarak mükemmel çalışır. Sonuçlarımı göstermek için sorumu düzenledim. –

1

Başka bir çözüm bağlantısı açmak için olabilir:

public partial class QueryModel : DbContext 
{ 
    public QueryModel(string connectionName):base(connectionName) 
    { 
     this.Database.Connection.Open(); 
    } 
} 
İlgili konular