Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Tom Dykstra
Aplikasi web sampel Contoso University menunjukkan cara membuat aplikasi ASP.NET Web Forms menggunakan Entity Framework 4.0 dan Visual Studio 2010. Untuk informasi tentang seri tutorial, lihat tutorial pertama dalam seri
Menerapkan Warisan Tabel per Hierarki
Dalam tutorial sebelumnya Anda bekerja dengan data terkait dengan menambahkan dan menghapus hubungan dan dengan menambahkan entitas baru yang memiliki hubungan dengan entitas yang ada. Tutorial ini akan menunjukkan kepada Anda cara menerapkan pewarisan dalam model data.
Dalam pemrograman berorientasi objek, Anda dapat menggunakan warisan untuk mempermudah bekerja dengan kelas terkait. Misalnya, Anda dapat membuat Instructor
kelas dan Student
yang berasal dari Person
kelas dasar. Anda dapat membuat jenis struktur pewarisan yang sama di antara entitas dalam Kerangka Kerja Entitas.
Di bagian tutorial ini, Anda tidak akan membuat halaman web baru. Sebagai gantinya, Anda akan menambahkan entitas turunan ke model data dan memodifikasi halaman yang ada untuk menggunakan entitas baru.
Tabel per Hierarki versus Warisan Tabel per Jenis
Database bisa menyimpan informasi tentang objek terkait dalam satu tabel atau di beberapa tabel. Misalnya, dalam School
database, Person
tabel menyertakan informasi tentang siswa dan instruktur dalam satu tabel. Beberapa kolom hanya berlaku untuk instruktur (HireDate
), beberapa hanya untuk siswa (EnrollmentDate
), dan beberapa untuk keduanya (LastName
, FirstName
).
Anda dapat mengonfigurasi Kerangka Kerja Entitas untuk membuat Instructor
entitas dan Student
yang mewarisi dari Person
entitas. Pola pembuatan struktur pewarisan entitas dari tabel database tunggal ini disebut pewarisan tabel per hierarki (TPH).
Untuk kursus, School
database menggunakan pola yang berbeda. Kursus online dan kursus lokal disimpan dalam tabel terpisah, yang masing-masing memiliki kunci asing yang menunjuk ke Course
tabel. Informasi yang umum untuk kedua jenis kursus hanya disimpan dalam Course
tabel.
Anda dapat mengonfigurasi model data Kerangka Kerja Entitas sehingga OnlineCourse
entitas dan OnsiteCourse
mewarisi dari Course
entitas. Pola pembuatan struktur pewarisan entitas ini dari tabel terpisah untuk setiap jenis, dengan setiap tabel terpisah merujuk kembali ke tabel yang menyimpan data yang umum untuk semua jenis, disebut pewarisan tabel per jenis (TPT).
Pola pewarisan TPH umumnya memberikan performa yang lebih baik dalam Kerangka Kerja Entitas daripada pola pewarisan TPT, karena pola TPT dapat menghasilkan kueri gabungan yang kompleks. Panduan ini menunjukkan cara menerapkan pewarisan TPH. Anda akan melakukannya dengan melakukan langkah-langkah berikut:
- Jenis entitas dan
Student
buatInstructor
yang berasal dariPerson
. - Pindahkan properti yang berkaitan dengan entitas turunan dari
Person
entitas ke entitas turunan. - Atur batasan pada properti dalam jenis turunan.
- Jadikan
Person
entitas sebagai entitas abstrak. - Petakan setiap entitas turunan ke
Person
tabel dengan kondisi yang menentukan cara menentukan apakahPerson
baris mewakili jenis turunan tersebut.
Menambahkan Entitas Instruktur dan Siswa
Buka file SchoolModel.edmx , klik kanan area yang tidak ditempati di perancang, pilih Tambahkan, lalu pilih Entitas.
Dalam kotak dialog Tambahkan Entitas , beri nama entitas Instructor
dan atur opsi Jenis dasarnya ke Person
.
Klik OK. Perancang membuat Instructor
entitas yang berasal dari Person
entitas. Entitas baru belum memiliki properti apa pun.
Ulangi prosedur untuk membuat Student
entitas yang juga berasal dari Person
.
Hanya instruktur yang memiliki tanggal persewaan, jadi Anda perlu memindahkan properti tersebut Person
dari entitas ke Instructor
entitas.
Person
Di entitas, klik HireDate
kanan properti dan klik Potong. Lalu klik kanan Properti di Instructor
entitas dan klik Tempel.
Tanggal persewaan Instructor
entitas tidak boleh null.
HireDate
Klik kanan properti, klik Properti, lalu di jendela Properti ubah Nullable
menjadi False
.
Ulangi prosedur untuk memindahkan EnrollmentDate
properti dari Person
entitas ke Student
entitas. Pastikan Anda juga mengatur Nullable
ke False
untuk EnrollmentDate
properti .
Person
Sekarang setelah entitas hanya memiliki properti yang umum untuk Instructor
dan Student
entitas (selain dari properti navigasi, yang tidak Anda pindahkan), entitas hanya dapat digunakan sebagai entitas dasar dalam struktur pewarisan. Oleh karena itu, Anda perlu memastikan bahwa itu tidak pernah diperlakukan sebagai entitas independen.
Person
Klik kanan entitas, pilih Properti, lalu di jendela Properti ubah nilai properti Abstrak menjadi True.
Memetakan Instruktur dan Entitas Siswa ke Tabel Orang
Sekarang Anda perlu memberi tahu Kerangka Kerja Entitas cara membedakan antara Instructor
entitas dan Student
dalam database.
Instructor
Klik kanan entitas dan pilih Pemetaan Tabel. Di jendela Detail Pemetaan , klik Tambahkan Tabel atau Tampilan dan pilih Orang.
Klik Tambahkan Kondisi, lalu pilih HireDate.
Ubah Operator menjadi Is dan Value / Property menjadi Not Null.
Ulangi prosedur untuk Students
entitas, yang menentukan bahwa entitas ini memetakan ke Person
tabel saat EnrollmentDate
kolom tidak null. Kemudian simpan dan tutup model data.
Bangun proyek untuk membuat entitas baru sebagai kelas dan membuatnya tersedia di perancang.
Menggunakan Entitas Instruktur dan Siswa
Saat Anda membuat halaman web yang berfungsi dengan data siswa dan instruktur, Anda mengikatnya ke Person
kumpulan entitas, dan Anda memfilter di HireDate
properti atau EnrollmentDate
untuk membatasi data yang dikembalikan kepada siswa atau instruktur. Namun, sekarang ketika Anda mengikat setiap kontrol sumber data ke Person
kumpulan entitas, Anda dapat menentukan bahwa hanya Student
atau Instructor
jenis entitas yang harus dipilih. Karena Entity Framework mengetahui cara membedakan siswa dan instruktur dalam Person
kumpulan entitas, Anda dapat menghapus Where
pengaturan properti yang Anda masukkan secara manual untuk melakukannya.
Di Designer Visual Studio, Anda bisa menentukan jenis entitas yang EntityDataSource
harus dipilih kontrol di kotak drop-down EntityTypeFilter wizardConfigure Data Source
, seperti yang diperlihatkan dalam contoh berikut.
Dan di jendela Properti Anda dapat menghapus Where
nilai klausul yang tidak lagi diperlukan, seperti yang ditunjukkan dalam contoh berikut.
Namun, karena Anda telah mengubah markup untuk kontrol untuk EntityDataSource
menggunakan atribut , ContextTypeName
Anda tidak dapat menjalankan wizard Konfigurasi Sumber Data pada EntityDataSource
kontrol yang telah Anda buat. Oleh karena itu, Anda akan membuat perubahan yang diperlukan dengan mengubah markup sebagai gantinya.
Buka halaman Students.aspx .
StudentsEntityDataSource
Dalam kontrol, hapus Where
atribut dan tambahkan EntityTypeFilter="Student"
atribut . Markup sekarang akan menyerupai contoh berikut:
<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>
EntityTypeFilter
Mengatur atribut memastikan bahwa EntityDataSource
kontrol hanya akan memilih jenis entitas yang ditentukan. Jika Anda ingin mengambil jenis Student
entitas dan Instructor
, Anda tidak akan mengatur atribut ini. (Anda memiliki opsi untuk mengambil beberapa jenis entitas dengan satu EntityDataSource
kontrol hanya jika Anda menggunakan kontrol untuk akses data baca-saja. Jika Anda menggunakan EntityDataSource
kontrol untuk menyisipkan, memperbarui, atau menghapus entitas, dan jika entitas yang diaturnya terikat untuk dapat berisi beberapa jenis, Anda hanya dapat bekerja dengan satu jenis entitas, dan Anda harus mengatur atribut ini.)
Ulangi prosedur untuk SearchEntityDataSource
kontrol, kecuali hapus hanya bagian Where
dari atribut yang memilih Student
entitas alih-alih menghapus properti sama sekali. Tag pembuka kontrol sekarang akan menyerupai contoh berikut:
<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 + '%'" >
Jalankan halaman untuk memverifikasi bahwa halaman masih berfungsi seperti sebelumnya.
Perbarui halaman berikut yang Anda buat di tutorial sebelumnya sehingga mereka menggunakan entitas dan Instructor
baru Student
alih-alih Person
entitas, lalu jalankan untuk memverifikasi bahwa mereka bekerja seperti yang mereka lakukan sebelumnya:
Di StudentsAdd.aspx, tambahkan
EntityTypeFilter="Student"
keStudentsEntityDataSource
kontrol. Markup sekarang akan menyerupai contoh berikut:<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" EntitySetName="People" EntityTypeFilter="Student" EnableInsert="True" </asp:EntityDataSource>
Di About.aspx, tambahkan
EntityTypeFilter="Student"
keStudentStatisticsEntityDataSource
kontrol dan hapusWhere="it.EnrollmentDate is not null"
. Markup sekarang akan menyerupai contoh berikut:<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>
Di Instruktur.aspx dan InstructorsCourses.aspx, tambahkan
EntityTypeFilter="Instructor"
keInstructorsEntityDataSource
kontrol dan hapusWhere="it.HireDate is not null"
. Markup di Instructors.aspx sekarang menyerupai contoh berikut:<asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="false" EntitySetName="People" EntityTypeFilter="Instructor" Include="OfficeAssignment" EnableUpdate="True"> </asp:EntityDataSource>
Markup di InstructorsCourses.aspx sekarang akan menyerupai contoh berikut:
<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>
Sebagai hasil dari perubahan ini, Anda telah meningkatkan keberlanjutan aplikasi Contoso University dalam beberapa cara. Anda telah memindahkan logika pemilihan dan validasi dari lapisan UI (markup.aspx ) dan menjadikannya bagian integral dari lapisan akses data. Ini membantu mengisolasi kode aplikasi Anda dari perubahan yang mungkin Anda buat di masa depan ke skema database atau model data. Misalnya, Anda dapat memutuskan bahwa siswa mungkin dipekerjakan sebagai bantuan guru dan oleh karena itu akan mendapatkan tanggal sewa. Anda kemudian dapat menambahkan properti baru untuk membedakan siswa dari instruktur dan memperbarui model data. Tidak ada kode dalam aplikasi web yang perlu diubah kecuali di mana Anda ingin menunjukkan tanggal sewa untuk siswa. Manfaat lain dari penambahan Instructor
dan Student
entitas adalah bahwa kode Anda lebih mudah dimengerti daripada ketika merujuk ke Person
objek yang sebenarnya siswa atau instruktur.
Anda sekarang telah melihat salah satu cara untuk menerapkan pola pewarisan dalam Kerangka Kerja Entitas. Dalam tutorial berikut, Anda akan mempelajari cara menggunakan prosedur tersimpan untuk memiliki kontrol lebih besar atas cara Kerangka Kerja Entitas mengakses database.