Kod tabanlı yapılandırma
Dekont
Yalnızca EF6'ya Doğru - Bu sayfada ele alınan özellikler, API'ler vb. Entity Framework 6'da sunulmuştur. Önceki bir sürümü kullanıyorsanız, bilgilerin bir kısmı veya tümü geçerli değildir.
Bir Entity Framework uygulamasının yapılandırması bir yapılandırma dosyasında (app.config/web.config) veya kod aracılığıyla belirtilebilir. İkincisi kod tabanlı yapılandırma olarak bilinir.
Yapılandırma dosyasındaki yapılandırma ayrı bir makalede açıklanmıştır. Yapılandırma dosyası, kod tabanlı yapılandırmadan önceliklidir. Başka bir deyişle, hem kodda hem de yapılandırma dosyasında bir yapılandırma seçeneği ayarlanırsa, yapılandırma dosyasındaki ayar kullanılır.
Kullan -arak DbConfiguration
EF6 ve üzerinde kod tabanlı yapılandırma, alt sınıfı System.Data.Entity.Config.DbConfiguration
oluşturularak elde edilir. Alt sınıflama DbConfiguration
sırasında aşağıdaki yönergeler izlenmelidir:
- Uygulamanız için yalnızca bir
DbConfiguration
sınıf oluşturun. Bu sınıf, uygulama etki alanı genelindeki ayarları belirtir. - Sınıfınızı sınıfınızla
DbConfiguration
DbContext
aynı derlemeye yerleştirin. (Bkz. Bunu değiştirmek istiyorsanız bölüm taşınıyorDbConfiguration
.) - Sınıfınıza
DbConfiguration
genel bir parametresiz oluşturucu verin. - Bu oluşturucudan korumalı
DbConfiguration
yöntemleri çağırarak yapılandırma seçeneklerini ayarlayın.
Bu yönergelerin uygulanması, EF'nin hem modelinize erişmesi gereken araçlar hem de uygulamanız çalıştırıldığında yapılandırmanızı otomatik olarak bulmasına ve kullanmasına olanak tanır.
Örnek
öğesinden DbConfiguration
türetilen bir sınıf aşağıdaki gibi görünebilir:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;
namespace MyNamespace
{
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
}
}
}
Bu sınıf, BAŞARıSıZ veritabanı işlemlerini otomatik olarak yeniden denemek için SQL Azure yürütme stratejisini kullanmak ve İlk Kod kuralıyla oluşturulan veritabanları için Yerel VERITABANı'nı kullanmak üzere EF'yi ayarlar.
Hareketli DbConfiguration
Sınıfınızı sınıfınızla DbConfiguration
aynı derlemeye DbContext
yerleştirmenin mümkün olmadığı durumlar vardır. Örneğin, her biri farklı derlemelerde iki DbContext
sınıfınız olabilir. Bunu işlemek için iki seçenek vardır.
İlk seçenek, kullanılacak örneği belirtmek DbConfiguration
için yapılandırma dosyasını kullanmaktır. Bunu yapmak için entityFramework bölümünün codeConfigurationType özniteliğini ayarlayın. Örnek:
<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
...Your EF config...
</entityFramework>
codeConfigurationType değeri, sınıfınızın DbConfiguration
derleme ve ad alanı nitelenmiş adı olmalıdır.
İkinci seçenek bağlam sınıfınıza yerleştirmektir DbConfigurationTypeAttribute
. Örnek:
[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}
Özniteliğine geçirilen değer, yukarıda gösterildiği gibi türünüz DbConfiguration
veya derleme ve ad alanı nitelenmiş tür adı dizesi olabilir. Örnek:
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}
Açıkça ayarlama DbConfiguration
Herhangi bir DbContext
tür kullanılmadan önce yapılandırmanın gerekebileceği bazı durumlar vardır. Buna örnek olarak şunlar verilebilir:
- Bağlam olmadan model oluşturmak için kullanma
DbModelBuilder
- Uygulama bağlamınız kullanılmadan önce bağlamın kullanıldığı bir yerde kullanılan başka bir
DbContext
çerçeve/yardımcı program kodu kullanma
Bu gibi durumlarda EF yapılandırmayı otomatik olarak bulamıyor ve bunun yerine aşağıdakilerden birini yapmalısınız:
DbConfiguration
Yukarıdaki TaşımaDbConfiguration
bölümünde açıklandığı gibi, yapılandırma dosyasındaki türü ayarlayın- statik
DbConfiguration
çağırın. Uygulama başlatma sırasında SetConfiguration yöntemi
Geçersiz kılma DbConfiguration
içinde yapılandırma kümesini DbConfiguration
geçersiz kılmanız gereken bazı durumlar vardır. Bu genellikle uygulama geliştiricileri tarafından değil, türetilmiş DbConfiguration
bir sınıfı kullanamayan üçüncü taraf sağlayıcılar ve eklentiler tarafından gerçekleştirilir.
Bunun için EntityFramework, kilitlenmeden hemen önce mevcut yapılandırmayı değiştirebilen bir olay işleyicinin kaydedilmesini sağlar. Ayrıca, EF hizmet bulucu tarafından döndürülen tüm hizmetleri değiştirmek için özel olarak bir şeker yöntemi sağlar. Bu şekilde kullanılması amaçlanmıştır:
- Uygulama başlangıcında (EF kullanılmadan önce) eklentinin veya sağlayıcının bu olay için olay işleyici yöntemini kaydetmesi gerekir. (Uygulama EF'yi kullanmadan önce bunun gerçekleşmesi gerektiğini unutmayın.)
- Olay işleyicisi değiştirilmesi gereken her hizmet için ReplaceService çağrısı yapar.
Örneğin, değiştirmek IDbConnectionFactory
için ve DbProviderService
bir işleyiciyi aşağıdakine benzer bir şekilde kaydedersiniz:
DbConfiguration.Loaded += (_, a) =>
{
a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
};
Yukarıdaki MyProviderServices
kodda ve MyConnectionFactory
hizmet uygulamalarınızı temsil eder.
Aynı etkiyi elde etmek için ek bağımlılık işleyicileri de ekleyebilirsiniz.
Bu şekilde de kaydırabileceğinizi DbProviderFactory
unutmayın, ancak bunu yapmak yalnızca EF'i etkiler ve EF'in dışından DbProviderFactory
kullanmaz. Bu nedenle, büyük olasılıkla daha önce yaptığınız gibi sarmalama DbProviderFactory
işlemine devam etmek isteyeceksiniz.
Ayrıca, örneğin Paket Yöneticisi Konsolu'ndan geçişleri çalıştırırken uygulamanızın dışında çalıştırdığınız hizmetleri de göz önünde bulundurmanız gerekir. Konsoldan geçişi çalıştırdığınızda, cihazınızı DbConfiguration
bulmaya çalışır. Ancak sarmalanmış hizmeti alıp almayacağı, kaydedildiği olay işleyicisine bağlıdır. Kodunuzun DbConfiguration
oluşturulmasının bir parçası olarak kayıtlıysa kodun yürütülmesi ve hizmetin sarmalanmış olması gerekir. Genellikle böyle olmaz ve bu, araçların sarmalanan hizmeti almayacağı anlamına gelir.