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) deyimiyleforeach
numaralandırılır. - , veya
ToList
gibiToArray
ToDictionary
bir koleksiyon işlemi tarafından numaralandırılır. - veya gibi
First
Any
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.ExecuteSqlCommand
veDbSet<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.