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
StudentbuatInstructoryang berasal dariPerson. - Pindahkan properti yang berkaitan dengan entitas turunan dari
Personentitas ke entitas turunan. - Atur batasan pada properti dalam jenis turunan.
- Jadikan
Personentitas sebagai entitas abstrak. - Petakan setiap entitas turunan ke
Persontabel dengan kondisi yang menentukan cara menentukan apakahPersonbaris 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"keStudentsEntityDataSourcekontrol. 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"keStudentStatisticsEntityDataSourcekontrol 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"keInstructorsEntityDataSourcekontrol 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.