Bagikan melalui


Mulai menggunakan Entity Framework 4.0 Database First dan ASP.NET 4 Web Forms - Bagian 6

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).

image11

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.

image12

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 buat Instructor yang berasal dari Person.
  • 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 apakah Person 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.

image01

Dalam kotak dialog Tambahkan Entitas , beri nama entitas Instructor dan atur opsi Jenis dasarnya ke Person.

image02

Klik OK. Perancang membuat Instructor entitas yang berasal dari Person entitas. Entitas baru belum memiliki properti apa pun.

image03

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.

image04

Tanggal persewaan Instructor entitas tidak boleh null. HireDate Klik kanan properti, klik Properti, lalu di jendela Properti ubah Nullable menjadi False.

image05

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.

image06

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.

image07

Klik Tambahkan Kondisi, lalu pilih HireDate.

image09

Ubah Operator menjadi Is dan Value / Property menjadi Not Null.

image10

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.

image13

Dan di jendela Properti Anda dapat menghapus Where nilai klausul yang tidak lagi diperlukan, seperti yang ditunjukkan dalam contoh berikut.

image14

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.

image15

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" ke StudentsEntityDataSource 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>
    

    image16

  • Di About.aspx, tambahkan EntityTypeFilter="Student" ke StudentStatisticsEntityDataSource kontrol dan hapus Where="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>
    

    image17

  • Di Instruktur.aspx dan InstructorsCourses.aspx, tambahkan EntityTypeFilter="Instructor" ke InstructorsEntityDataSource kontrol dan hapus Where="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>
    

    image18

    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>
    

    image19

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.