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.
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.
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ündenPerson
tü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 birPerson
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.
Varlık Ekle iletişim kutusunda varlığı Instructor
adlandırın ve Temel tür seçeneğini olarak Person
ayarlayın.
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.
yordamını yineleyin ve 'den Person
de 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.
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 False
değiştirinNullable
.
Özelliği varlıktan Person
varlığa taşımak EnrollmentDate
için Student
yordamı yineleyin. Özelliği için olarak da ayarladığınızdan Nullable
False
EnrollmentDate
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.
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.
Koşul Ekle'ye tıklayın ve HireDate'ı seçin.
İşleciis ve değer / özellikolarak Null Değil olarak değiştirin.
Bu varlığın Students
sütun null olmadığında tabloyla Person
EnrollmentDate
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.
Özellikler penceresinde, aşağıdaki örnekte gösterildiği gibi artık gerekli olmayan yan tümce değerlerini kaldırabilirsinizWhere
.
Ancak, özniteliğini kullanmak üzere EntityDataSource
denetimlerin işaretlemesini değiştirdiğinizdenContextTypeName
, daha önce oluşturduğunuz denetimlerde EntityDataSource
Veri 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.
Ö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>
About.aspx'da denetimine
StudentStatisticsEntityDataSource
ekleyinEntityTypeFilter="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>
Instructors.aspx ve InstructorsCourses.aspx içinde denetime
InstructorsEntityDataSource
ekleyinEntityTypeFilter="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>
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>
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.