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.DbConfigurationoluşturularak elde edilir. Alt sınıflama DbConfigurationsı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 DbConfigurationDbContext aynı derlemeye yerleştirin. (Bkz. Bunu değiştirmek istiyorsanız bölüm taşınıyor DbConfiguration .)
  • 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şıma DbConfiguration 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 DbConfigurationgeç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ı DbConfigurationbulmaya ç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.