Aracılığıyla paylaş


Önceden oluşturulmuş eşleme görünümleri

Entity Framework'ün bir sorguyu yürütebilmesi veya veri kaynağındaki değişiklikleri kaydedebilmesi için önce veritabanına erişmek için bir dizi eşleme görünümü oluşturması gerekir. Bu eşleme görünümleri, veritabanını soyut bir şekilde temsil eden bir Entity SQL deyimi kümesidir ve uygulama etki alanı başına önbelleğe alınan meta verilerin bir parçasıdır. Aynı uygulama etki alanında aynı bağlamın birden çok örneğini oluşturursanız, bunlar yeniden oluşturmak yerine önbelleğe alınan meta verilerdeki eşleme görünümlerini yeniden kullanır. Eşleme görünümü oluşturma, ilk sorguyu yürütmenin genel maliyetinin önemli bir parçası olduğundan, Entity Framework eşleme görünümlerini önceden oluşturmanıza ve bunları derlenen projeye eklemenize olanak tanır. Daha fazla bilgi için bkz . PerformansLa İlgili Önemli Noktalar (Entity Framework).

EF Power Tools Community Edition ile Eşleme Görünümleri Oluşturma

Görünümleri önceden oluşturmanın en kolay yolu EF Power Tools Community Edition'ı kullanmaktır. Power Tools'u yükledikten sonra, aşağıda gösterildiği gibi Görünüm Oluştur'a yönelik bir menü seçeneğine sahip olursunuz.

  • Code First modelleri için DbContext sınıfınızı içeren kod dosyasına sağ tıklayın.
  • EF Tasarım Aracı modelleri için EDMX dosyanıza sağ tıklayın.

generate Views

İşlem tamamlandıktan sonra aşağıdakine benzer bir sınıfınız oluşturulur

generated Views

Şimdi uygulamanızı çalıştırdığınızda EF, görünümleri gerektiği gibi yüklemek için bu sınıfı kullanacaktır. Modeliniz değişirse ve bu sınıfı yeniden oluşturmazsanız EF bir özel durum oluşturur.

Koddan Eşleme Görünümleri Oluşturma - EF6 Devam Ediyor

Görünüm oluşturmanın diğer yolu, EF'in sağladığı API'leri kullanmaktır. Bu yöntemi kullanırken görünümleri istediğiniz gibi seri hale getirme özgürlüğüne sahip olursunuz, ancak görünümleri kendiniz de yüklemeniz gerekir.

Dekont

YALNıZCA EF6'ya Doğru - Bu bölümde gösterilen API'ler Entity Framework 6'da tanıtılmıştır. Önceki bir sürümü kullanıyorsanız bu bilgiler geçerli değildir.

Görünüm Oluşturma

Görünüm oluşturmak için API'ler System.Data.Entity.Core.Mapping üzerindedir. Depolama MappingItemCollection sınıfı. ObjectContext'in MetadataWorkspace değerini kullanarak bağlam için Depolama MappingCollection alabilirsiniz. Daha yeni DbContext API'sini kullanıyorsanız, aşağıdaki gibi IObjectContextAdapter kullanarak buna erişebilirsiniz, bu kodda türetilmiş DbContext örneğinizin dbContext adlı bir örneği vardır:

    var objectContext = ((IObjectContextAdapter) dbContext).ObjectContext;
    var  mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace
                                                                        .GetItemCollection(DataSpace.CSSpace);

Depolama MappingItemCollection'a sahip olduktan sonra GenerateViews ve ComputeMappingHashValue yöntemlerine erişebilirsiniz.

    public Dictionary<EntitySetBase, DbMappingView> GenerateViews(IList<EdmSchemaError> errors)
    public string ComputeMappingHashValue()

İlk yöntem, kapsayıcı eşlemesindeki her görünüm için bir giriş içeren bir sözlük oluşturur. İkinci yöntem, tek kapsayıcı eşlemesi için bir karma değeri hesaplar ve çalışma zamanında görünümlerin önceden oluşturulmasından sonra modelin değişmediğini doğrulamak için kullanılır. Birden çok kapsayıcı eşlemesi içeren karmaşık senaryolar için iki yöntemin geçersiz kılmaları sağlanır.

Görünüm oluştururken GenerateViews yöntemini çağıracak ve ardından elde edilen EntitySetBase ve DbMappingView değerlerini yazacaksınız. ComputeMappingHashValue yöntemi tarafından oluşturulan karmayı da depolamanız gerekir.

Görünümleri Yükleme

GenerateViews yöntemi tarafından oluşturulan görünümleri yüklemek için EF'ye DbMappingViewCache soyut sınıfından devralan bir sınıf sağlayabilirsiniz. DbMappingViewCache uygulamanız gereken iki yöntemi belirtir:

    public abstract string MappingHashValue { get; }
    public abstract DbMappingView GetView(EntitySetBase extent);

MappingHashValue özelliği ComputeMappingHashValue yöntemi tarafından oluşturulan karmayı döndürmelidir. EF görünümler isteyecekse, önce modelin karma değerini bu özellik tarafından döndürülen karma değerle oluşturur ve karşılaştırır. Eşleşmezse EF bir EntityCommandCompilationException özel durumu oluşturur.

GetView yöntemi bir EntitySetBase'i kabul eder ve GenerateViews yöntemi tarafından oluşturulan sözlükte verilen EntitySetBase ile ilişkili olan entitysql öğesini içeren bir DbMappingVIew döndürmeniz gerekir. EF sahip olmadığınız bir görünüm isterse GetView null döndürmelidir.

Aşağıda, yukarıda açıklandığı gibi Power Tools ile oluşturulan DbMappingViewCache'ten alınan bir ayıklanmıştır. Burada gerekli EntitySql'i depolamanın ve almanın tek bir yolunu görüyoruz.

    public override string MappingHashValue
    {
        get { return "a0b843f03dd29abee99789e190a6fb70ce8e93dc97945d437d9a58fb8e2afd2e"; }
    }

    public override DbMappingView GetView(EntitySetBase extent)
    {
        if (extent == null)
        {
            throw new ArgumentNullException("extent");
        }

        var extentName = extent.EntityContainer.Name + "." + extent.Name;

        if (extentName == "BlogContext.Blogs")
        {
            return GetView2();
        }

        if (extentName == "BlogContext.Posts")
        {
            return GetView3();
        }

        return null;
    }

    private static DbMappingView GetView2()
    {
        return new DbMappingView(@"
            SELECT VALUE -- Constructing Blogs
            [BlogApp.Models.Blog](T1.Blog_BlogId, T1.Blog_Test, T1.Blog_title, T1.Blog_Active, T1.Blog_SomeDecimal)
            FROM (
            SELECT
                T.BlogId AS Blog_BlogId,
                T.Test AS Blog_Test,
                T.title AS Blog_title,
                T.Active AS Blog_Active,
                T.SomeDecimal AS Blog_SomeDecimal,
                True AS _from0
            FROM CodeFirstDatabase.Blog AS T
            ) AS T1");
    }

EF'nin DbMappingViewCache'inizi kullanmasını sağlamak için DbMappingViewCacheTypeAttribute'u kullanın ve oluşturulduğu bağlamı belirtin. Aşağıdaki kodda BlogContext'i MyMappingViewCache sınıfıyla ilişkilendiriyoruz.

    [assembly: DbMappingViewCacheType(typeof(BlogContext), typeof(MyMappingViewCache))]

Daha karmaşık senaryolar için eşleme görünümü önbellek örnekleri bir eşleme görünümü önbellek fabrikası belirtilerek sağlanabilir. Bu, System.Data.Entity.Infrastructure.MappingViews.DbMappingViewCacheFactory soyut sınıfı uygulanarak yapılabilir. Kullanılan eşleme görünümü önbellek fabrikası örneği Depolama MappingItemCollection.MappingViewCacheFactoryproperty kullanılarak alınabilir veya ayarlanabilir.