TPH Devralmayı Tasarım Aracı

Bu adım adım izlenecek yol, Entity Framework Tasarım Aracı (EF Tasarım Aracı) ile kavramsal modelinizde hiyerarşi başına tablo (TPH) devralmayı nasıl uygulayacaklarını gösterir. TPH devralma, devralma hiyerarşisindeki tüm varlık türlerinin verilerini korumak için bir veritabanı tablosu kullanır.

Bu kılavuzda Kişi tablosunu üç varlık türüyle eşleyeceğiz: Kişi (temel tür), Öğrenci (Kişi'den türetilir) ve Eğitmen (Kişi'den türetilir). Veritabanından kavramsal bir model oluşturacağız (Önce Veritabanı) ve ardından EF Tasarım Aracı kullanarak TPH devralmayı uygulamak için modeli değiştireceğiz.

Önce Model kullanarak bir TPH devralma işlemine eşlemek mümkündür, ancak karmaşık olan kendi veritabanı oluşturma iş akışınızı yazmanız gerekir. Daha sonra bu iş akışını EF Tasarım Aracı Veritabanı Oluşturma İş Akışı özelliğine atayabilirsiniz. Daha kolay bir alternatif, Önce Kod kullanmaktır.

Diğer Devralma Seçenekleri

Tür Başına Tablo (TPT), veritabanındaki ayrı tabloların devralmaya katılan varlıklara eşlendiği başka bir devralma türüdür.  Tür Başına Tablo devralmayı EF Tasarım Aracı eşleme hakkında bilgi için bkz. EF Tasarım Aracı TPT Devralma.

Beton Başına Tablo Türü Devralma (TPC) ve karma devralma modelleri Entity Framework çalışma zamanı tarafından desteklenir, ancak EF Tasarım Aracı tarafından desteklenmez. TPC veya karma devralma kullanmak istiyorsanız iki seçeneğiniz vardır: Önce Kod kullanma veya EDMX dosyasını el ile düzenleme. EDMX dosyasıyla çalışmayı seçerseniz, Eşleme Ayrıntıları Penceresi "güvenli moda" alınır ve eşlemeleri değiştirmek için tasarımcıyı kullanamazsınız.

Ön koşullar

Bu kılavuzu tamamlamak için şunlara ihtiyacınız olacak:

Projeyi ayarlama

  • Visual Studio 2012'i açın.
  • Dosya-> Yeni -> Proje'yi seçin
  • Sol bölmede Visual C# öğesine tıklayın ve konsol şablonunu seçin.
  • Ad olarak TPHDBFirstSample girin.
  • Tamam'ı seçin.

Model Oluşturma

  • Çözüm Gezgini proje adına sağ tıklayın ve Ekle -> Yeni Öğe'yi seçin.
  • Soldaki menüden Veri'yi seçin ve ardından Şablonlar bölmesinde Varlık Veri Modeli'ni ADO.NET seçin.
  • Dosya adı olarak TPHModel.edmx yazın ve Ekle'ye tıklayın.
  • Model İçeriği Seç iletişim kutusunda Veritabanından oluştur'u seçin ve ardından İleri'ye tıklayın.
  • Yeni Bağlan ion'a tıklayın. Bağlan ion Özellikleri iletişim kutusunda sunucu adını girin (örneğin, (localdb)\mssqllocaldb), kimlik doğrulama yöntemini seçin, veritabanı adı için School yazın ve Tamam'a tıklayın. Verilerinizi seçin Bağlan ion iletişim kutusu veritabanı bağlantı ayarınızla güncelleştirilir.
  • Veritabanı Nesnelerinizi Seçin iletişim kutusunda, Tablolar düğümü altında Kişi tablosunu seçin.
  • Finish (Son) düğmesine tıklayın.

Modelinizi düzenlemek için bir tasarım yüzeyi sağlayan Entity Tasarım Aracı görüntülenir. Veritabanı Nesnelerinizi Seçin iletişim kutusunda seçtiğiniz tüm nesneler modele eklenir.

Kişi tablosu veritabanında böyle görünür.

Person Table 

Hiyerarşi Başına Tablo Devralma Uygulama

Kişi tablosunda iki değerden birine sahip olabilecek Ayrımcı sütunu vardır: "Öğrenci" ve "Eğitmen". Değere bağlı olarak, Kişi tablosu Öğrenci varlığıyla veya Eğitmen varlığıyla eşlenir. Kişi tablosunda ayrıca, bir kişi aynı anda öğrenci ve eğitmen olamadığı için null atanabilir olması gereken HireDate ve EnrollmentDate adlı iki sütun da vardır (en azından bu kılavuzda).

Yeni Varlıklar Ekle

  • Yeni bir varlık ekleyin. Bunu yapmak için Entity Framework Tasarım Aracı tasarım yüzeyinin boş bir alanına sağ tıklayın ve Varlık Ekle'yi> seçin.
  • Varlık adı için Eğitmen yazın ve Temel türü için açılan listeden Kişi'yi seçin.
  • Tamam'a tıklayın.
  • Başka bir yeni varlık ekleyin. Varlık adı olarak Öğrenci yazın ve Temel türü için açılan listeden Kişi'yi seçin.

Tasarım yüzeyine iki yeni varlık türü eklendi. Yeni varlık türlerinden Kişi varlık türüne işaret eden bir ok; bu, Kişi'nin yeni varlık türleri için temel tür olduğunu gösterir.

  • Kişi varlığının HireDate özelliğine sağ tıklayın. Kes'i seçin (veya Ctrl-X tuşunu kullanın).
  • Eğitmen varlığına sağ tıklayın ve Yapıştır'ı seçin (veya Ctrl-V tuşunu kullanın).
  • HireDate özelliğine sağ tıklayın ve Özellikler'i seçin.
  • Özellikler penceresinde Null atanabilir özelliğini false olarak ayarlayın.
  • Kişi varlığının EnrollmentDate özelliğine sağ tıklayın. Kes'i seçin (veya Ctrl-X tuşunu kullanın).
  • Öğrenci varlığına sağ tıklayın ve Yapıştır'ı seçin (veya Ctrl-V tuşunu kullanın).
  • EnrollmentDate özelliğini seçin ve Nullable özelliğini false olarak ayarlayın.
  • Kişi varlık türünü seçin. Özellikler penceresinde Soyut özelliğini true olarak ayarlayın.
  • Discriminator özelliğini Person'dan silin. Silinmesinin nedeni aşağıdaki bölümde açıklanmıştır.

Varlıkları eşleme

  • Eğitmene sağ tıklayın ve Tablo Eşlemesi'ni seçin. Eşleme Ayrıntıları penceresinde Eğitmen varlığı seçilir.

  • Eşleme Ayrıntıları penceresinde Tablo veya Görünüm> Ekle'ye tıklayın<. <Tablo veya Görünüm> Ekle alanı, seçili varlığın eşlenebileceği tabloların veya görünümlerin açılan listesi haline gelir.

  • Açılan listeden Kişi'yi seçin.

  • Eşleme Ayrıntıları penceresi, varsayılan sütun eşlemeleri ve koşul ekleme seçeneğiyle güncelleştirilir.

  • Koşul> Ekle'ye <tıklayın. <Koşul> Ekle alanı, koşulların ayarlanabileceği sütunların açılan listesi haline gelir.

  • Açılan listeden Ayırıcı'ya tıklayın.

  • Eşleme Ayrıntıları penceresinin İşleç sütununda, açılan listeden = öğesini seçin.

  • Değer/Özellik sütununa Eğitmen yazın. Sonuç şu şekilde görünmelidir:

    Mapping Details

  • Öğrenci varlık türü için bu adımları yineleyin, ancak koşulu Öğrenci değerine eşit hale getirin.
    Discriminator özelliğini kaldırmak isteme nedenimiz, bir tablo sütununu birden çok kez eşleyemezsiniz. Bu sütun koşullu eşleme için kullanılacağı için özellik eşlemesi için de kullanılamaz. Bir koşul Is Null veya Is Not Null karşılaştırması kullanıyorsa, her ikisi için de tek yol kullanılabilir.

Hiyerarşi başına tablo devralma işlemi artık uygulandı.

Final TPH

Modeli Kullanma

Main yönteminin tanımlandığı Program.cs dosyasını açın. Aşağıdaki kodu Main işlevine yapıştırın. Kod üç sorgu yürütür. İlk sorgu tüm Kişi nesnelerini geri getirir. İkinci sorgu, Eğitmen nesnelerini döndürmek için OfType yöntemini kullanır. Üçüncü sorgu, Student nesnelerini döndürmek için OfType yöntemini kullanır.

    using (var context = new SchoolEntities())
    {
        Console.WriteLine("All people:");
        foreach (var person in context.People)
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Instructors only: ");
        foreach (var person in context.People.OfType<Instructor>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Students only: ");
        foreach (var person in context.People.OfType<Student>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }
    }