Entity Framework 4.0 Database First ve ASP.NET 4 Web Forms ile Çalışmaya Başlama - Bölüm 6

tarafından Tom Dykstra

Contoso University örnek web uygulaması, Entity Framework 4.0 ve Visual Studio 2010 kullanarak ASP.NET Web Forms uygulamaları oluşturmayı gösterir. Öğretici serisi hakkında bilgi için serideki ilk öğreticiye bakın

Hiyerarşi Başına Tablo Devralmayı Uygulama

Önceki öğreticide, ilişkileri ekleyip silerek ve var olan bir varlıkla ilişkisi olan yeni bir varlık ekleyerek ilgili verilerle çalıştınız. Bu öğreticide veri modelinde devralmayı nasıl uygulayacağınız gösterilir.

Nesne odaklı programlamada, ilgili sınıflarla çalışmayı kolaylaştırmak için devralmayı kullanabilirsiniz. Örneğin, bir Person temel sınıftan türetilen ve Student sınıfları oluşturabilirsinizInstructor. Entity Framework'teki varlıklar arasında aynı tür devralma yapıları oluşturabilirsiniz.

Öğreticinin bu bölümünde yeni web sayfası oluşturmayacaksınız. Bunun yerine, türetilmiş varlıkları veri modeline ekleyecek ve mevcut sayfaları yeni varlıkları kullanacak şekilde değiştireceksiniz.

Hiyerarşi Başına Tablo ve Tür Başına Tablo Devralma

Veritabanı, ilgili nesneler hakkındaki bilgileri bir tabloda veya birden çok tabloda depolayabilir. Örneğin, School veritabanında Person , tablo tek bir tabloda hem öğrenciler hem de eğitmenler hakkında bilgiler içerir. Sütunların bazıları yalnızca eğitmenler ()HireDate için, bazıları yalnızca öğrenciler için ()EnrollmentDate ve bazıları da her ikisi için (LastName, FirstName) geçerlidir.

resim11

Varlık Çerçevesi'ni varlıktan Person devralan ve Student varlıkları oluşturacak Instructor şekilde yapılandırabilirsiniz. Tek bir veritabanı tablosundan varlık devralma yapısı oluşturma deseni , hiyerarşi başına tablo (TPH) devralma olarak adlandırılır.

Kurslar School için veritabanı farklı bir desen kullanır. Çevrimiçi kurslar ve yerindeki kurslar, her biri tabloya Course işaret eden bir yabancı anahtara sahip olan ayrı tablolarda depolanır. Her iki kurs türü için de ortak olan bilgiler yalnızca Course tabloda depolanır.

image12

Entity Framework veri modelini, ve OnsiteCourse varlıklarının varlıktan Course devralması OnlineCourse için yapılandırabilirsiniz. Her tür için ayrı tablolardan varlık devralma yapısı oluşturma ve her ayrı tablonun her tür için ortak verileri depolayan bir tabloya başvurması, tür başına tablo (TPT) devralma olarak adlandırılır.

TPH devralma desenleri genellikle Entity Framework'te TPT devralma desenlerine göre daha iyi performans sunar, çünkü TPT desenleri karmaşık birleştirme sorgularında sonuçlanabilir. Bu kılavuzda TPH devralmayı uygulama gösterilmektedir. Bunu yapmak için aşağıdaki adımları gerçekleştireceksiniz:

  • Student ve türünden Persontüretilen varlık türleri oluşturunInstructor.
  • Varlıktan Person türetilmiş varlıklarla ilgili özellikleri türetilmiş varlıklara taşıyın.
  • Türetilen türlerdeki özelliklerde kısıtlamalar ayarlayın.
  • Person Varlığı soyut bir varlık yapın.
  • Türetilmiş her varlığı tabloya Person eşleyin ve bir satırın türetilen türü temsil edip etmediğini belirlemeyi belirten bir Person koşulla eşleyin.

Eğitmen ve Öğrenci Varlıkları Ekleme

SchoolModel.edmx dosyasını açın, tasarımcıda boş bir alana sağ tıklayın, Ekle'yi ve ardından Varlık'ı seçin.

görüntü01

Varlık Ekle iletişim kutusunda varlığı Instructor adlandırın ve Temel tür seçeneğini olarak Personayarlayın.

görüntü02

Tamam'a tıklayın. Tasarımcı, varlıktan Person türetilen bir Instructor varlık oluşturur. Yeni varlığın henüz herhangi bir özelliği yok.

görüntü03

yordamını yineleyin ve 'den Personde türetilen bir Student varlık oluşturun.

Yalnızca eğitmenlerin işe alma tarihleri vardır, bu nedenle bu özelliği varlıktan Person varlığa Instructor taşımanız gerekir. Varlıkta Person özelliğe sağ tıklayın ve Kes'eHireDate tıklayın. Ardından varlıkta Özellikler'e sağ tıklayın ve Yapıştır'aInstructor tıklayın.

image04

Bir Instructor varlığın işe alma tarihi null olamaz. Özelliğe sağ tıklayınHireDate, Özellikler'e tıklayın ve Özellikler penceresinde olarak FalsedeğiştirinNullable.

görüntü05

Özelliği varlıktan Person varlığa taşımak EnrollmentDate için Student yordamı yineleyin. Özelliği için olarak da ayarladığınızdan NullableFalseEnrollmentDate emin olun.

Artık bir Person varlık yalnızca ve Student varlıkları için ortak özelliklere Instructor sahip olduğuna göre (taşımadığınız gezinti özelliklerinin yanı sıra), varlık yalnızca devralma yapısında temel varlık olarak kullanılabilir. Bu nedenle, hiçbir zaman bağımsız bir varlık olarak değerlendirilmediğinden emin olmanız gerekir. Varlığa sağ tıklayın Person , Özellikler'i seçin ve Özellikler penceresinde Soyut özelliğinin değerini True olarak değiştirin.

görüntü06

Eğitmen ve Öğrenci Varlıklarını Kişi Tablosuna Eşleme

Şimdi Entity Framework'e veritabanındaki ve Student varlıkları arasında Instructor nasıl ayrım yapılacağını söylemeniz gerekir.

Varlığa sağ tıklayın ve Tablo Eşleme'yiInstructor seçin. Eşleme Ayrıntıları penceresinde Tablo Veya Görünüm Ekle'ye tıklayın ve Kişi'yi seçin.

image07

Koşul Ekle'ye tıklayın ve HireDate'ı seçin.

image09

İşleciis ve değer / özellikolarak Null Değil olarak değiştirin.

resim10

Bu varlığın Students sütun null olmadığında tabloyla PersonEnrollmentDate eşleneceğini belirterek varlık için yordamı yineleyin. Ardından veri modelini kaydedip kapatın.

Yeni varlıkları sınıf olarak oluşturmak ve tasarımcıda kullanılabilir hale getirmek için projeyi oluşturun.

Eğitmen ve Öğrenci Varlıklarını Kullanma

Öğrenci ve eğitmen verileriyle çalışan web sayfalarını oluşturduğunuzda, bunları varlık kümesine Person iletir ve döndürülen verileri öğrencilerle veya eğitmenlerle kısıtlamak için veya EnrollmentDate özelliğine filtre HireDate uygulamış olursunuz. Ancak, artık her veri kaynağı denetimini varlık kümesine Person bağladığınızda, yalnızca Student veya Instructor varlık türlerinin seçilmesi gerektiğini belirtebilirsiniz. Entity Framework, varlık kümesindeki Person öğrencileri ve eğitmenleri ayırt etme konusunda bilgi sahibi olduğundan, bunu yapmak için el ile girdiğiniz özellik ayarlarını kaldırabilirsiniz Where .

Visual Studio Tasarım Aracı, aşağıdaki örnekte gösterildiği gibi, sihirbazın EntityTypeFilter açılan kutusunda bir EntityDataSource denetimin seçmesi Configure Data Source gereken varlık türünü belirtebilirsiniz.

image13

Özellikler penceresinde, aşağıdaki örnekte gösterildiği gibi artık gerekli olmayan yan tümce değerlerini kaldırabilirsinizWhere.

resim14

Ancak, özniteliğini kullanmak üzere EntityDataSource denetimlerin işaretlemesini değiştirdiğinizdenContextTypeName, daha önce oluşturduğunuz denetimlerde EntityDataSourceVeri Kaynağını Yapılandırma sihirbazını çalıştıramazsınız. Bu nedenle, bunun yerine işaretlemeyi değiştirerek gerekli değişiklikleri yapacaksınız.

Students.aspx sayfasını açın. Denetimde StudentsEntityDataSource özniteliğini Where kaldırın ve bir EntityTypeFilter="Student" öznitelik ekleyin. İşaretlemesi artık aşağıdaki örneğe benzeyecektir:

<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
        EntitySetName="People" EntityTypeFilter="Student"
        Include="StudentGrades"
        EnableDelete="True" EnableUpdate="True" 
        OrderBy="it.LastName" >
    </asp:EntityDataSource>

özniteliğini EntityTypeFilter ayarlamak, denetimin EntityDataSource yalnızca belirtilen varlık türünü seçmesini sağlar. Hem Instructor hem de Student varlık türlerini almak istiyorsanız, bu özniteliği ayarlamazsınız. (Yalnızca denetimi salt okunur veri erişimi için kullanıyorsanız tek EntityDataSource denetimle birden çok varlık türünü alma seçeneğiniz vardır. Varlıkları eklemek, güncelleştirmek veya silmek için bir EntityDataSource denetim kullanıyorsanız ve bağlı olduğu varlık kümesi birden çok tür içerebiliyorsa, yalnızca bir varlık türüyle çalışabilirsiniz ve bu özniteliği ayarlamanız gerekir.)

Denetimin yordamını SearchEntityDataSource yineleyin, ancak özelliği tamamen kaldırmak yerine özniteliğin Where yalnızca varlıkları seçen Student bölümünü kaldırın. Denetimin açma etiketi artık aşağıdaki örneğe benzer:

<asp:EntityDataSource ID="SearchEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
        EntitySetName="People" EntityTypeFilter="Student"
        Where="it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%' + @StudentName + '%'" >

Daha önce olduğu gibi çalışmaya devam ettiğini doğrulamak için sayfayı çalıştırın.

image15

Önceki öğreticilerde oluşturduğunuz aşağıdaki sayfaları, varlıklar yerine Person yeni Student ve varlıkları kullanacak şekilde güncelleştirin ve Instructor daha önce yaptıkları gibi çalıştıklarını doğrulamak için bunları çalıştırın:

  • StudentsAdd.aspx içinde denetime StudentsEntityDataSource ekleyinEntityTypeFilter="Student". İşaretlemesi artık aşağıdaki örneğe benzeyecektir:

    <asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
            EntitySetName="People" EntityTypeFilter="Student"
            EnableInsert="True" 
        </asp:EntityDataSource>
    

    image16

  • About.aspx'da denetimine StudentStatisticsEntityDataSource ekleyin EntityTypeFilter="Student" ve öğesini kaldırınWhere="it.EnrollmentDate is not null". İşaretlemesi artık aşağıdaki örneğe benzeyecektir:

    <asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
            EntitySetName="People" EntityTypeFilter="Student"
            Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
            OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate" >
        </asp:EntityDataSource>
    

    resim17

  • Instructors.aspx ve InstructorsCourses.aspx içinde denetime InstructorsEntityDataSource ekleyin EntityTypeFilter="Instructor" ve öğesini kaldırınWhere="it.HireDate is not null". Instructors.aspx'daki işaretleme artık aşağıdaki örneğe benzer:

    <asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" 
                ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="false"
                EntitySetName="People" EntityTypeFilter="Instructor" 
                Include="OfficeAssignment" 
                EnableUpdate="True">
            </asp:EntityDataSource>
    

    resim18

    InstructorsCourses.aspx'daki işaretleme artık aşağıdaki örneğe benzeyecektir:

    <asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
            EntitySetName="People" EntityTypeFilter="Instructor" 
            Select="it.LastName + ',' + it.FirstMidName AS Name, it.PersonID">
        </asp:EntityDataSource>
    

    resim19

Bu değişikliklerin sonucunda Contoso Üniversitesi uygulamasının sürdürülebilirliğini çeşitli yollarla geliştirdiniz. Seçim ve doğrulama mantığını kullanıcı arabirimi katmanından (.aspx işaretleme) taşıdınız ve veri erişim katmanının ayrılmaz bir parçası haline getirdiniz. Bu, uygulama kodunuzu gelecekte veritabanı şemasında veya veri modelinde yapabileceğiniz değişikliklerden yalıtmaya yardımcı olur. Örneğin, öğrencilerin öğretmenlerin yardımları olarak işe alınabileceğine ve bu nedenle işe alım tarihi alınabileceğine karar vekleyebilirsiniz. Ardından öğrencileri eğitmenlerden ayırmak ve veri modelini güncelleştirmek için yeni bir özellik ekleyebilirsiniz. Öğrenciler için işe alma tarihini göstermek istediğiniz yer dışında web uygulamasındaki hiçbir kodun değişmesi gerekmez. ve Student varlık eklemenin Instructor bir diğer avantajı da kodunuzun aslında öğrenci veya eğitmen olan nesnelere Person başvurduğundan daha kolay anlaşılır olmasıdır.

Şimdi Entity Framework'te devralma desenini uygulamanın bir yolunu gördünüz. Aşağıdaki öğreticide, Entity Framework'ün veritabanına nasıl eriştiği üzerinde daha fazla denetim sahibi olmak için saklı yordamları kullanmayı öğreneceksiniz.