Bagikan melalui


Apa yang Baru dalam Kerangka Kerja Entitas 4.0

oleh Tom Dykstra

Seri tutorial ini dibangun pada aplikasi web Contoso University yang dibuat oleh seri tutorial Memulai Kerangka Kerja Entitas . Jika Anda tidak menyelesaikan tutorial sebelumnya, sebagai titik awal untuk tutorial ini, Anda dapat mengunduh aplikasi yang akan Anda buat. Anda juga dapat mengunduh aplikasi yang dibuat oleh seri tutorial lengkap. Jika Anda memiliki pertanyaan tentang tutorial, Anda dapat mempostingnya ke forum ASP.NET Entity Framework.

Dalam tutorial sebelumnya Anda melihat beberapa metode untuk memaksimalkan performa aplikasi web yang menggunakan Kerangka Kerja Entitas. Tutorial ini meninjau beberapa fitur baru yang paling penting di versi 4 dari Kerangka Kerja Entitas, dan menautkan ke sumber daya yang memberikan pengenalan yang lebih lengkap ke semua fitur baru. Fitur yang disorot dalam tutorial ini meliputi hal-hal berikut:

  • Asosiasi kunci asing.
  • Menjalankan perintah SQL yang ditentukan pengguna.
  • Pengembangan model-pertama.
  • Dukungan POCO.

Selain itu, tutorial akan memperkenalkan pengembangan code-first secara singkat, fitur yang akan hadir dalam rilis Berikutnya dari Entity Framework.

Untuk memulai tutorial, mulai Visual Studio dan buka aplikasi web Contoso University yang sedang Anda kerjakan di tutorial sebelumnya.

Asosiasi Foreign-Key

Versi 3.5 dari Kerangka Kerja Entitas menyertakan properti navigasi, tetapi tidak menyertakan properti kunci asing dalam model data. Misalnya, CourseID kolom StudentGrade dan StudentID tabel akan dihilangkan dari StudentGrade entitas.

Gambar01

Alasan untuk pendekatan ini adalah bahwa, secara ketat, kunci asing adalah detail implementasi fisik dan tidak termasuk dalam model data konseptual. Namun, sebagai masalah praktis, seringkali lebih mudah untuk bekerja dengan entitas dalam kode ketika Anda memiliki akses langsung ke kunci asing.

Untuk contoh bagaimana kunci asing dalam model data dapat menyederhanakan kode Anda, pertimbangkan bagaimana Anda harus membuat kode halaman DepartmentsAdd.aspx tanpanya. Department Dalam entitas, Administrator properti adalah kunci asing yang sesuai dengan PersonID dalam Person entitas. Untuk membangun hubungan antara departemen baru dan administratornya, yang harus Anda lakukan adalah menetapkan nilai untuk Administrator properti dalam ItemInserting penanganan aktivitas kontrol terikat data:

protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}

Tanpa kunci asing dalam model data, Anda akan menangani Inserting peristiwa kontrol sumber data alih-alih ItemInserting peristiwa kontrol terikat data, untuk mendapatkan referensi ke entitas itu sendiri sebelum entitas ditambahkan ke kumpulan entitas. Saat Anda memiliki referensi tersebut, Anda membuat asosiasi menggunakan kode seperti itu dalam contoh berikut:

departmentEntityToBeInserted.PersonReference.EntityKey = new System.Data.EntityKey("SchoolEntities.Departments", "PersonID", Convert.ToInt32(administratorsDropDownList.SelectedValue));
departmentEntityToBeInserted.Person = context.People.Single(p => p.PersonID == Convert.ToInt32(administratorsDropDownList.SelectedValue));

Seperti yang Anda lihat di posting blog tim Kerangka Kerja Entitas di asosiasi Kunci Asing, ada kasus lain di mana perbedaan kompleksitas kode jauh lebih besar. Untuk memenuhi kebutuhan mereka yang lebih suka hidup dengan detail implementasi dalam model data konseptual demi kode yang lebih sederhana, Kerangka Kerja Entitas sekarang memberi Anda opsi untuk menyertakan kunci asing dalam model data.

Dalam terminologi Kerangka Kerja Entitas, jika Anda menyertakan kunci asing dalam model data yang Anda gunakan asosiasi kunci asing, dan jika Anda mengecualikan kunci asing, Anda menggunakan asosiasi independen.

Menjalankan Perintah SQL User-Defined

Dalam versi Kerangka Kerja Entitas yang lebih lama, tidak ada cara mudah untuk membuat perintah SQL Anda sendiri dengan cepat dan menjalankannya. Baik Perintah SQL yang dihasilkan secara dinamis oleh Kerangka Kerja Entitas untuk Anda, atau Anda harus membuat prosedur tersimpan dan mengimpornya sebagai fungsi. Versi 4 menambahkan ExecuteStoreQuery dan ExecuteStoreCommand metoda kelas ObjectContext yang memudahkan Anda untuk meneruskan kueri apa pun langsung ke database.

Misalkan administrator Contoso University ingin dapat melakukan perubahan massal dalam database tanpa harus melalui proses pembuatan prosedur tersimpan dan mengimpornya ke dalam model data. Permintaan pertama mereka adalah untuk halaman yang memungkinkan mereka mengubah jumlah kredit untuk semua kursus dalam database. Pada halaman web, mereka ingin dapat memasukkan angka yang akan digunakan untuk mengalikan nilai kolom setiap Course baris Credits .

Buat halaman baru yang menggunakan halaman master Site.Master dan beri nama UpdateCredits.aspx. Kemudian tambahkan markup berikut ke Content kontrol bernama Content2:

<h2>Update Credits</h2>
    Enter the number to multiply the current number of credits by: 
    <asp:TextBox ID="CreditsMultiplierTextBox" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Button ID="ExecuteButton" runat="server" Text="Execute" OnClick="ExecuteButton_Click" /><br /><br />
    Rows affected:
    <asp:Label ID="RowsAffectedLabel" runat="server" Text="0" ViewStateMode="Disabled"></asp:Label><br /><br />

Markup ini membuat TextBox kontrol di mana pengguna dapat memasukkan nilai pengali, Button kontrol untuk diklik untuk menjalankan perintah, dan Label kontrol untuk menunjukkan jumlah baris yang terpengaruh.

Buka UpdateCredits.aspx.cs, dan tambahkan pernyataan berikut using dan handler untuk peristiwa tombol Click :

using ContosoUniversity.DAL;
protected void ExecuteButton_Click(object sender, EventArgs e)
{
    using (SchoolEntities context = new SchoolEntities())
    {
        RowsAffectedLabel.Text = context.ExecuteStoreCommand("UPDATE Course SET Credits = Credits * {0}", CreditsMultiplierTextBox.Text).ToString();
    }
}

Kode ini menjalankan perintah SQL Update menggunakan nilai dalam kotak teks dan menggunakan label untuk menampilkan jumlah baris yang terpengaruh. Sebelum Anda menjalankan halaman, jalankan halaman Courses.aspx untuk mendapatkan gambar "sebelum" dari beberapa data.

Gambar02

Jalankan UpdateCredits.aspx, masukkan "10" sebagai pengali, lalu klik Jalankan.

Gambar03

Jalankan halaman Courses.aspx lagi untuk melihat data yang diubah.

Gambar04

(Jika Anda ingin mengatur jumlah kredit kembali ke nilai aslinya, di UpdateCredits.aspx.cs ubah Credits * {0} ke Credits / {0} dan jalankan kembali halaman, masukkan 10 sebagai pembagi.)

Untuk informasi selengkapnya tentang menjalankan kueri yang Anda tentukan dalam kode, lihat Cara: Langsung Menjalankan Perintah Terhadap Sumber Data.

Pengembangan Model-First

Dalam panduan ini, Anda membuat database terlebih dahulu lalu menghasilkan model data berdasarkan struktur database. Di Entity Framework 4 Anda dapat memulai dengan model data sebagai gantinya dan menghasilkan database berdasarkan struktur model data. Jika Anda membuat aplikasi yang databasenya belum ada, pendekatan model-first memungkinkan Anda membuat entitas dan hubungan yang masuk akal secara konseptual untuk aplikasi, sambil tidak khawatir tentang detail implementasi fisik. (Namun, ini tetap berlaku hanya melalui tahap awal pengembangan. Akhirnya database akan dibuat dan akan memiliki data produksi di dalamnya, dan membuatnya kembali dari model tidak akan lagi praktis; pada saat itu Anda akan kembali ke pendekatan database-first.)

Di bagian tutorial ini, Anda akan membuat model data sederhana dan menghasilkan database darinya.

Di Penjelajah Solusi, klik kanan folder DAL dan pilih Tambahkan Item Baru. Dalam kotak dialog Tambahkan Item Baru , di bawah Templat Terinstal pilih Data lalu pilih templat Model Data Entitas ADO.NET . Beri nama file baru AlumniAssociationModel.edmx dan klik Tambahkan.

Gambar06

Ini meluncurkan Wizard Model Data Entitas. Di langkah Pilih Konten Model , pilih Model Kosong lalu klik Selesai.

Gambar07

Model Data Entitas Designer terbuka dengan permukaan desain kosong. Seret item Entitas dari Kotak Alat ke permukaan desain.

Gambar08

Ubah nama entitas dari Entity1 ke , ubah Id nama properti menjadi AlumnusId, dan tambahkan properti skalar baru bernama NameAlumnus. Untuk menambahkan properti baru, Anda dapat menekan Enter setelah mengubah nama Id kolom, atau klik kanan entitas dan pilih Tambahkan Properti Skalar. Jenis default untuk properti baru adalah String, yang baik-baik saja untuk demonstrasi sederhana ini, tetapi tentu saja Anda dapat mengubah hal-hal seperti jenis data di jendela Properti .

Buat entitas lain dengan cara yang sama dan beri Donationnama . Ubah properti menjadi IdDonationId dan tambahkan properti skalar bernama DateAndAmount.

Gambar09

Untuk menambahkan hubungan antara kedua entitas ini, klik Alumnus kanan entitas, pilih Tambahkan, lalu pilih Asosiasi.

Gambar10

Nilai default dalam kotak dialog Tambahkan Asosiasi adalah apa yang Anda inginkan (satu-ke-banyak, sertakan properti navigasi, sertakan kunci asing), jadi cukup klik OK.

Gambar11

Perancang menambahkan garis asosiasi dan properti kunci asing.

Gambar12

Sekarang Anda siap untuk membuat database. Klik kanan permukaan desain dan pilih Buat Database dari Model.

Gambar13

Ini meluncurkan Wizard Buat Database. (Jika Anda melihat peringatan yang menunjukkan bahwa entitas tidak dipetakan, Anda dapat mengabaikannya untuk saat ini.)

Di langkah Pilih Koneksi Data Anda , klik Koneksi Baru.

Gambar14

Dalam kotak dialog Properti Koneksi, pilih instans SQL Server Express lokal dan beri nama database AlumniAssociation.

Gambar15

Klik Ya saat Anda ditanya apakah Anda ingin membuat database. Saat langkah Pilih Koneksi Data Anda ditampilkan lagi, klik Berikutnya.

Di langkah Ringkasan dan Pengaturan , klik Selesai.

Gambar18

File .sql dengan perintah bahasa definisi data (DDL) dibuat, tetapi perintah belum dijalankan.

Gambar20

Gunakan alat seperti SQL Server Management Studio untuk menjalankan skrip dan membuat tabel, seperti yang mungkin telah Anda lakukan ketika Anda membuat School database untuk tutorial pertama dalam seri tutorial Memulai. (Kecuali Anda mengunduh database.)

Sekarang Anda dapat menggunakan AlumniAssociation model data di halaman web Anda dengan cara yang sama seperti Anda telah menggunakan model.School Untuk mencobanya, tambahkan beberapa data ke tabel dan buat halaman web yang menampilkan data.

Menggunakan Server Explorer, tambahkan baris berikut ke Alumnus tabel dan Donation .

Gambar21

Buat halaman web baru bernama Alumni.aspx yang menggunakan halaman master Site.Master . Tambahkan markup berikut ke Content kontrol bernama Content2:

<h2>Alumni</h2>
    <asp:EntityDataSource ID="AlumniEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.AlumniAssociationModelContainer" EnableFlattening="False" 
        EntitySetName="Alumni">
    </asp:EntityDataSource>
    <asp:GridView ID="AlumniGridView" runat="server" 
        DataSourceID="AlumniEntityDataSource" AutoGenerateColumns="False"
        OnRowDataBound="AlumniGridView_RowDataBound"
        DataKeyNames="AlumnusId">
        <Columns>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:TemplateField HeaderText="Donations">
                <ItemTemplate>
                    <asp:GridView ID="DonationsGridView" runat="server" AutoGenerateColumns="False">
                        <Columns>
                            <asp:BoundField DataField="DateAndAmount" HeaderText="Date and Amount" />
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

Markup ini membuat kontrol berlapis GridView , yang luar untuk menampilkan nama alumni dan yang dalam untuk menampilkan tanggal dan jumlah sumbangan.

Buka Alumni.aspx.cs. using Tambahkan pernyataan untuk lapisan akses data dan handler untuk peristiwa kontrol RowDataBound luarGridView:

using ContosoUniversity.DAL; 

// ...

protected void AlumniGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var alumnus = e.Row.DataItem as Alumnus;
        var donationsGridView = (GridView)e.Row.FindControl("DonationsGridView");
        donationsGridView.DataSource = alumnus.Donations.ToList();
        donationsGridView.DataBind();
    }
}

Data kode ini menggabungkan kontrol dalam GridView menggunakan Donations properti navigasi entitas baris Alumnus saat ini.

Jalankan halaman.

Gambar22

(Catatan: Halaman ini disertakan dalam proyek yang dapat diunduh, tetapi untuk membuatnya berfungsi, Anda harus membuat database di instans SQL Server Express lokal Anda; database tidak disertakan sebagai file .mdf di folder App_Data.)

Untuk informasi selengkapnya tentang menggunakan fitur model-first dari Entity Framework, lihat Model-First di Entity Framework 4.

Dukungan POCO

Saat Anda menggunakan metodologi desain berbasis domain, Anda merancang kelas data yang mewakili data dan perilaku yang relevan dengan domain bisnis. Kelas-kelas ini harus independen dari teknologi tertentu yang digunakan untuk menyimpan (bertahan) data; dengan kata lain, mereka harus persistensi tidak tahu. Ketidaktahuan persistensi juga dapat membuat kelas lebih mudah untuk pengujian unit karena proyek pengujian unit dapat menggunakan teknologi persistensi apa pun yang paling nyaman untuk pengujian. Versi Sebelumnya dari Kerangka Kerja Entitas menawarkan dukungan terbatas untuk ketidaktahuan persistensi karena kelas entitas harus mewarisi dari EntityObject kelas dan dengan demikian menyertakan banyak fungsionalitas khusus Kerangka Kerja Entitas.

Entity Framework 4 memperkenalkan kemampuan untuk menggunakan kelas entitas yang tidak mewarisi dari EntityObject kelas dan karenanya tidak tahu persistensi. Dalam konteks Kerangka Kerja Entitas, kelas seperti ini biasanya disebut objek CLR biasa-lama (POCO, atau POCO). Anda dapat menulis kelas POCO secara manual, atau Anda dapat secara otomatis membuatnya berdasarkan model data yang ada menggunakan templat Text Template Transformation Toolkit (T4) yang disediakan oleh Entity Framework.

Untuk informasi selengkapnya tentang menggunakan POCO di Kerangka Kerja Entitas, lihat sumber daya berikut ini:

Pengembangan Code-First

Dukungan POCO di Entity Framework 4 masih mengharuskan Anda membuat model data dan menautkan kelas entitas Anda ke model data. Rilis Berikutnya dari Entity Framework akan menyertakan fitur yang disebut pengembangan code-first. Fitur ini memungkinkan Anda menggunakan Kerangka Kerja Entitas dengan kelas POCO Anda sendiri tanpa perlu menggunakan perancang model data atau file XML model data. (Oleh karena itu, opsi ini juga disebut hanya kode; code-first dan code-only keduanya merujuk ke fitur Entity Framework yang sama.)

Untuk informasi selengkapnya tentang menggunakan pendekatan code-first untuk pengembangan, lihat sumber daya berikut:

Selain itu, tutorial Code-First MVC baru yang membangun aplikasi yang mirip dengan aplikasi Contoso University diproyeksikan untuk diterbitkan pada musim semi 2011 di https://asp.net/entity-framework/tutorials

Informasi Lebih Lanjut

Ini menyelesaikan gambaran umum tentang apa yang baru dalam Kerangka Kerja Entitas dan ini Melanjutkan dengan seri tutorial Kerangka Kerja Entitas. Untuk informasi selengkapnya tentang fitur baru di Kerangka Kerja Entitas 4 yang tidak tercakup di sini, lihat sumber daya berikut ini: