DbContext ile Çalışma

.NET nesnelerini kullanarak verileri sorgulamak, eklemek, güncelleştirmek ve silmek için Entity Framework kullanmak için öncelikle modelinizde tanımlanan varlıkları ve ilişkileri veritabanındaki tablolarla eşleyen bir Model Oluşturmanız gerekir.

Bir modeliniz olduğunda, uygulamanızın etkileşimde olduğu birincil sınıftır System.Data.Entity.DbContext (genellikle bağlam sınıfı olarak adlandırılır). Bir modelle ilişkilendirilmiş bir DbContext kullanarak:

  • Sorgu yazma ve yürütme
  • Sorgu sonuçlarını varlık nesneleri olarak gerçekleştirme
  • Bu nesnelerde yapılan değişiklikleri izleme
  • Nesne değişikliklerini veritabanında kalıcı hale getir
  • Bellekteki nesneleri kullanıcı arabirimi denetimlerine bağlama

Bu sayfa bağlam sınıfını yönetme hakkında bazı yönergeler sağlar.

DbContext türetilmiş sınıfı tanımlama

Bağlamla çalışmanın önerilen yolu, DbContext'ten türetilen ve bağlamda belirtilen varlıkların koleksiyonlarını temsil eden DbSet özelliklerini kullanıma sunan bir sınıf tanımlamaktır. EF Tasarım Aracı ile çalışıyorsanız bağlam sizin için oluşturulur. Code First ile çalışıyorsanız genellikle bağlamı kendiniz yazarsınız.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Bir bağlam elde ettikten sonra, bu özellikler aracılığıyla bağlam içindeki varlıkları sorgular, ekler (veya yöntemler) Add veya kaldırırsınız (kullanarakRemove).Attach Bağlam nesnesinde bir DbSet özelliğe erişmek, belirtilen türdeki tüm varlıkları döndüren bir başlangıç sorgusunu temsil eder. Yalnızca bir özelliğe erişmenin sorguyu yürütmediğini unutmayın. Sorgu şu durumlarda yürütülür:

  • Bir (C#) veya For Each (Visual Basic) deyimiyle foreach numaralandırılır.
  • , veya ToListgibi ToArrayToDictionarybir koleksiyon işlemi tarafından numaralandırılır.
  • veya gibi FirstAny LINQ işleçleri sorgunun en dış kısmında belirtilir.
  • Aşağıdaki yöntemlerden biri çağrılır: Load uzantı yöntemi, DbEntityEntry.Reload, Database.ExecuteSqlCommandve DbSet<T>.Find, belirtilen anahtara sahip bir varlık bulunamazsa bağlam içinde zaten yüklüdür.

Yaşam süresi

Bağlamın ömrü, örnek oluşturulduğunda başlar ve örnek atıldığında veya çöp toplandığında biter. Bağlam denetimlerinin tüm kaynaklarının bloğun sonunda atılmasını istiyorsanız kullanarak kullanın. kullanarak kullandığınızda, derleyici otomatik olarak bir try/finally bloğu oluşturur ve çağrıları finally bloğuna atılır.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Bağlamın ömrüne karar verirken bazı genel yönergeler şunlardır:

  • Web uygulamalarıyla çalışırken, istek başına bir bağlam örneği kullanın.
  • Windows Presentation Foundation (WPF) veya Windows Forms ile çalışırken form başına bağlam örneği kullanın. Bu, bağlam tarafından sunulan değişiklik izleme işlevini kullanmanıza olanak tanır.
  • Bağlam örneği bir bağımlılık ekleme kapsayıcısı tarafından oluşturulduysa, bağlamı atmak genellikle kapsayıcının sorumluluğundadır.
  • Bağlam uygulama kodunda oluşturulduysa, artık gerekli olmadığında bağlamı atmanız gerektiğini unutmayın.
  • Uzun süre çalışan bağlamla çalışırken aşağıdakileri göz önünde bulundurun:
    • Belleğe daha fazla nesne ve başvuru yükledikçe, bağlamın bellek tüketimi hızla artabilir. Bu durum performans sorunlarına neden olabilir.
    • Bağlam iş parçacığı açısından güvenli değildir, bu nedenle üzerinde eşzamanlı olarak çalışan birden çok iş parçacığı arasında paylaşılmamalıdır.
    • Bir özel durum bağlamın kurtarılamaz durumda olmasını neden olursa, tüm uygulama sonlandırılabilir.
    • Verilerin sorgulandığı ve güncelleştirildiği zaman arasındaki boşluk arttıkça eşzamanlılık ile ilgili sorunlarla karşılaşılıyor olma olasılığı artar.

Bağlantılar

Varsayılan olarak, bağlam veritabanı bağlantılarını yönetir. Bağlam açılır ve gerektiğinde bağlantıları kapatır. Örneğin, bağlam sorguyu yürütmek için bir bağlantı açar ve ardından tüm sonuç kümeleri işlendiğinde bağlantıyı kapatır.

Bağlantının ne zaman açılıp kapantığı üzerinde daha fazla denetim sahibi olmak istediğiniz durumlar vardır. Örneğin, SQL Server Compact ile çalışırken, performansı artırmak için genellikle uygulamanın ömrü boyunca veritabanına ayrı bir açık bağlantının tutulması önerilir. Özelliğini kullanarak Connection bu işlemi el ile yönetebilirsiniz.