Bagikan melalui


Tutorial: Pelajari tentang Skenario EF tingkat lanjut untuk aplikasi Web MVC 5

Dalam tutorial sebelumnya Anda menerapkan warisan tabel per hierarki. Tutorial ini mencakup memperkenalkan beberapa topik yang berguna untuk diperhatikan ketika Anda melampaui dasar-dasar pengembangan ASP.NET aplikasi web yang menggunakan Kode Kerangka Kerja Entitas Terlebih Dahulu. Beberapa bagian pertama memiliki instruksi langkah demi langkah yang memandu Anda melalui kode dan menggunakan Visual Studio untuk menyelesaikan tugas Bagian yang mengikuti memperkenalkan beberapa topik dengan pengenalan singkat diikuti dengan tautan ke sumber daya untuk informasi selengkapnya.

Untuk sebagian besar topik ini, Anda akan bekerja dengan halaman yang sudah Anda buat. Untuk menggunakan SQL mentah untuk melakukan pembaruan massal, Anda akan membuat halaman baru yang memperbarui jumlah kredit semua kursus dalam database:

Update_Course_Credits_initial_page

Di tutorial ini, Anda akan:

  • Melakukan kueri SQL mentah
  • Melakukan kueri tanpa pelacakan
  • Memeriksa kueri SQL yang dikirim ke database

Anda juga mempelajari tentang:

  • Membuat lapisan abstraksi
  • Kelas proksi
  • Deteksi perubahan otomatis
  • Validasi otomatis
  • Alat Daya Kerangka Kerja Entitas
  • Kode sumber Kerangka Kerja Entitas

Prasyarat

Melakukan kueri SQL mentah

ENTITY Framework Code First API menyertakan metode yang memungkinkan Anda meneruskan perintah SQL langsung ke database. Anda memiliki opsi berikut:

  • Gunakan metode DbSet.SqlQuery untuk kueri yang mengembalikan jenis entitas. Objek yang dikembalikan harus dari jenis yang diharapkan oleh DbSet objek, dan secara otomatis dilacak oleh konteks database kecuali Anda menonaktifkan pelacakan. (Lihat bagian berikut tentang metode AsNoTracking .)
  • Gunakan metode Database.SqlQuery untuk kueri yang mengembalikan jenis yang bukan entitas. Data yang dikembalikan tidak dilacak oleh konteks database, bahkan jika Anda menggunakan metode ini untuk mengambil jenis entitas.
  • Gunakan Database.ExecuteSqlCommand untuk perintah non-kueri.

Salah satu keuntungan menggunakan Kerangka Kerja Entitas adalah menghindari pengikatan kode Anda terlalu dekat dengan metode tertentu untuk menyimpan data. Ini dilakukan dengan menghasilkan kueri dan perintah SQL untuk Anda, yang juga membebaskan Anda dari keharusan menulisnya sendiri. Tetapi ada skenario luar biasa ketika Anda perlu menjalankan kueri SQL tertentu yang telah Anda buat secara manual, dan metode ini memungkinkan Anda untuk menangani pengecualian tersebut.

Seperti biasa berlaku ketika Anda menjalankan perintah SQL dalam aplikasi web, Anda harus mengambil tindakan pencegahan untuk melindungi situs Anda dari serangan injeksi SQL. Salah satu cara untuk melakukannya adalah dengan menggunakan kueri berparameter untuk memastikan bahwa string yang dikirimkan oleh halaman web tidak dapat ditafsirkan sebagai perintah SQL. Dalam tutorial ini Anda akan menggunakan kueri berparameter saat mengintegrasikan input pengguna ke dalam kueri.

Memanggil Kueri yang Mengembalikan Entitas

Kelas DbSet<TEntity> menyediakan metode yang dapat Anda gunakan untuk menjalankan kueri yang mengembalikan entitas jenis TEntity. Untuk melihat cara kerjanya, Anda akan mengubah kode dalam Details metode Department pengontrol.

Di DepartmentController.cs, dalam Details metode , ganti db.Departments.FindAsync panggilan metode dengan db.Departments.SqlQuery panggilan metode, seperti yang ditunjukkan dalam kode yang disorot berikut:

public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    // Commenting out original code to show how to use a raw SQL query.
    //Department department = await db.Departments.FindAsync(id);

    // Create and execute raw SQL query.
    string query = "SELECT * FROM Department WHERE DepartmentID = @p0";
    Department department = await db.Departments.SqlQuery(query, id).SingleOrDefaultAsync();
    
    if (department == null)
    {
        return HttpNotFound();
    }
    return View(department);
}

Untuk memverifikasi bahwa kode baru berfungsi dengan benar, pilih tab Departemen lalu Detail untuk salah satu departemen. Pastikan semua data ditampilkan seperti yang diharapkan.

Memanggil Kueri yang Mengembalikan Tipe Objek Lain

Sebelumnya Anda membuat kisi statistik siswa untuk halaman Tentang yang menunjukkan jumlah siswa untuk setiap tanggal pendaftaran. Kode yang melakukan ini di HomeController.cs menggunakan LINQ:

var data = from student in db.Students
           group student by student.EnrollmentDate into dateGroup
           select new EnrollmentDateGroup()
           {
               EnrollmentDate = dateGroup.Key,
               StudentCount = dateGroup.Count()
           };

Misalkan Anda ingin menulis kode yang mengambil data ini langsung di SQL daripada menggunakan LINQ. Untuk melakukannya, Anda perlu menjalankan kueri yang mengembalikan sesuatu selain objek entitas, yang berarti Anda perlu menggunakan metode Database.SqlQuery .

Di HomeController.cs, ganti pernyataan LINQ dalam About metode dengan pernyataan SQL, seperti yang ditunjukkan dalam kode yang disorot berikut:

public ActionResult About()
{
    // Commenting out LINQ to show how to do the same thing in SQL.
    //IQueryable<EnrollmentDateGroup> = from student in db.Students
    //           group student by student.EnrollmentDate into dateGroup
    //           select new EnrollmentDateGroup()
    //           {
    //               EnrollmentDate = dateGroup.Key,
    //               StudentCount = dateGroup.Count()
    //           };

    // SQL version of the above LINQ code.
    string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
        + "FROM Person "
        + "WHERE Discriminator = 'Student' "
        + "GROUP BY EnrollmentDate";
    IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query);

    return View(data.ToList());
}

Jalankan halaman Tentang. Verifikasi bahwa data tersebut menampilkan data yang sama sebelumnya.

Memanggil Kueri Pembaruan

Misalkan administrator Contoso University ingin dapat melakukan perubahan massal dalam database, seperti mengubah jumlah kredit untuk setiap kursus. Jika universitas memiliki sejumlah besar kursus, tidak akan efisien untuk mengambil semuanya sebagai entitas dan mengubahnya satu per satu. Di bagian ini, Anda akan menerapkan halaman web yang memungkinkan pengguna menentukan faktor untuk mengubah jumlah kredit untuk semua kursus, dan Anda akan membuat perubahan dengan menjalankan pernyataan SQL UPDATE .

Di CourseController.cs, tambahkan UpdateCourseCredits metode untuk HttpGet dan HttpPost:

public ActionResult UpdateCourseCredits()
{
    return View();
}

[HttpPost]
public ActionResult UpdateCourseCredits(int? multiplier)
{
    if (multiplier != null)
    {
        ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
    }
    return View();
}

Ketika pengontrol memproses permintaan, tidak ada yang HttpGet dikembalikan dalam ViewBag.RowsAffected variabel, dan tampilan menampilkan kotak teks kosong dan tombol kirim.

Saat tombol Perbarui diklik, HttpPost metode dipanggil, dan multiplier memiliki nilai yang dimasukkan dalam kotak teks. Kode kemudian menjalankan SQL yang memperbarui kursus dan mengembalikan jumlah baris yang terpengaruh ke tampilan dalam ViewBag.RowsAffected variabel. Saat tampilan mendapatkan nilai dalam variabel tersebut, tampilan akan menampilkan jumlah baris yang diperbarui alih-alih kotak teks dan tombol kirim.

Di CourseController.cs, klik kanan salah UpdateCourseCredits satu metode, lalu klik Tambahkan Tampilan. Dialog Tambahkan Tampilan muncul. Biarkan default dan pilih Tambahkan.

Di Views\Course\UpdateCourseCredits.cshtml, ganti kode templat dengan kode berikut:

@model ContosoUniversity.Models.Course

@{
    ViewBag.Title = "UpdateCourseCredits";
}

<h2>Update Course Credits</h2>

@if (ViewBag.RowsAffected == null)
{
    using (Html.BeginForm())
    {
        <p>
            Enter a number to multiply every course's credits by: @Html.TextBox("multiplier")
        </p>
        <p>
            <input type="submit" value="Update" />
        </p>
    }
}
@if (ViewBag.RowsAffected != null)
{
    <p>
        Number of rows updated: @ViewBag.RowsAffected
    </p>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

UpdateCourseCredits Jalankan metode dengan memilih tab Kursus, lalu tambahkan "/UpdateCourseCredits" ke akhir URL di bilah alamat browser (misalnya: http://localhost:50205/Course/UpdateCourseCredits). Masukkan angka dalam kotak teks:

Update_Course_Credits_initial_page_with_2_entered

Klik Perbarui. Anda melihat jumlah baris yang terpengaruh.

Klik Kembali ke Daftar untuk melihat daftar kursus dengan jumlah kredit yang direvisi.

Untuk informasi selengkapnya tentang kueri SQL mentah, lihat Kueri SQL Mentah di MSDN.

Kueri tanpa pelacakan

Saat konteks database mengambil baris tabel dan membuat objek entitas yang mewakilinya, secara default konteks tersebut melacak apakah entitas dalam memori sinkron dengan apa yang ada di database. Data dalam memori bertindak sebagai cache dan digunakan saat Anda memperbarui entitas. Penembolokan ini sering kali tidak perlu dalam aplikasi web karena instans konteks biasanya berumur pendek (yang baru dibuat dan dibuang untuk setiap permintaan) dan konteks yang membaca entitas biasanya dibuang sebelum entitas tersebut digunakan lagi.

Anda dapat menonaktifkan pelacakan objek entitas dalam memori dengan menggunakan metode AsNoTracking . Skenario umum di mana Anda mungkin ingin melakukan itu termasuk yang berikut ini:

  • Kueri mengambil data dalam volume besar yang menonaktifkan pelacakan mungkin akan meningkatkan performa.
  • Anda ingin melampirkan entitas untuk memperbaruinya, tetapi Anda sebelumnya mengambil entitas yang sama untuk tujuan yang berbeda. Karena entitas sudah dilacak oleh konteks database, Anda tidak dapat melampirkan entitas yang ingin Anda ubah. Salah satu cara untuk menangani situasi ini adalah dengan menggunakan AsNoTracking opsi dengan kueri sebelumnya.

Untuk contoh yang menunjukkan cara menggunakan metode AsNoTracking , lihat versi tutorial ini sebelumnya. Versi tutorial ini tidak mengatur bendera Diubah pada entitas yang dibuat model-binder dalam metode Edit, sehingga tidak memerlukan AsNoTracking.

Memeriksa SQL yang dikirim ke database

Terkadang sangat membantu untuk dapat melihat kueri SQL aktual yang dikirim ke database. Dalam tutorial sebelumnya Anda melihat cara melakukannya dalam kode pencegat; sekarang Anda akan melihat beberapa cara untuk melakukannya tanpa menulis kode pencegat. Untuk mencobanya, Anda akan melihat kueri sederhana dan kemudian melihat apa yang terjadi padanya saat Anda menambahkan opsi seperti memuat, memfilter, dan mengurutkan yang bersemangat.

Di Controllers/CourseController, ganti Index metode dengan kode berikut, untuk menghentikan pemuatan yang ingin dimuat untuk sementara:

public ActionResult Index()
{
    var courses = db.Courses;
    var sql = courses.ToString();
    return View(courses.ToList());
}

Sekarang atur titik henti pada return pernyataan (F9 dengan kursor pada baris tersebut). Tekan F5 untuk menjalankan proyek dalam mode debug, dan pilih halaman Indeks Kursus. Ketika kode mencapai titik henti, periksa sql variabel . Anda melihat kueri yang dikirim ke SQL Server. Ini pernyataan sederhana Select .

{SELECT 
[Extent1].[CourseID] AS [CourseID], 
[Extent1].[Title] AS [Title], 
[Extent1].[Credits] AS [Credits], 
[Extent1].[DepartmentID] AS [DepartmentID]
FROM [Course] AS [Extent1]}

Klik kaca pembesar untuk melihat kueri di Visualizer Teks.

Satu cuplikan layar yang memperlihatkan Pengontrol Kursus dengan baris kode disorot. Cuplikan layar lain yang memperlihatkan Visualizer Teks terbuka dan kaca pembesar dilingkari dengan warna merah di bidang Nilai.

Sekarang Anda akan menambahkan daftar drop-down ke halaman Indeks Kursus sehingga pengguna dapat memfilter departemen tertentu. Anda akan mengurutkan kursus berdasarkan judul, dan Anda akan menentukan pemuatan yang ingin dimuat untuk Department properti navigasi.

Di CourseController.cs, ganti Index metode dengan kode berikut:

public ActionResult Index(int? SelectedDepartment)
{
    var departments = db.Departments.OrderBy(q => q.Name).ToList();
    ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment);
    int departmentID = SelectedDepartment.GetValueOrDefault();

    IQueryable<Course> courses = db.Courses
        .Where(c => !SelectedDepartment.HasValue || c.DepartmentID == departmentID)
        .OrderBy(d => d.CourseID)
        .Include(d => d.Department);
    var sql = courses.ToString();
    return View(courses.ToList());
}

Pulihkan titik henti pada return pernyataan .

Metode menerima nilai yang dipilih dari daftar drop-down dalam SelectedDepartment parameter . Jika tidak ada yang dipilih, parameter ini akan null.

Koleksi SelectList yang berisi semua departemen diteruskan ke tampilan untuk daftar drop-down. Parameter yang diteruskan ke SelectList konstruktor menentukan nama bidang nilai, nama bidang teks, dan item yang dipilih.

Get Untuk metode Course repositori, kode menentukan ekspresi filter, urutan pengurutan, dan pemuatan bersemangat untuk Department properti navigasi. Ekspresi filter selalu kembali true jika tidak ada yang dipilih dalam daftar drop-down (artinya, SelectedDepartment null).

Di Views\Course\Index.cshtml, tepat sebelum tag pembuka table , tambahkan kode berikut untuk membuat daftar drop-down dan tombol kirim:

@using (Html.BeginForm())
{
    <p>Select Department: @Html.DropDownList("SelectedDepartment","All")   
    <input type="submit" value="Filter" /></p>
}

Dengan titik henti masih diatur, jalankan halaman Indeks Kursus. Lanjutkan hingga pertama kali kode mencapai titik henti, sehingga halaman ditampilkan di browser. Pilih departemen dari daftar drop-down dan klik Filter.

Kali ini titik henti pertama adalah untuk kueri departemen untuk daftar drop-down. Lewati itu dan tampilkan query variabel lain kali kode mencapai titik henti untuk melihat seperti apa Course kueri sekarang. Anda akan melihat sesuatu seperti berikut ini:

SELECT 
    [Project1].[CourseID] AS [CourseID], 
    [Project1].[Title] AS [Title], 
    [Project1].[Credits] AS [Credits], 
    [Project1].[DepartmentID] AS [DepartmentID], 
    [Project1].[DepartmentID1] AS [DepartmentID1], 
    [Project1].[Name] AS [Name], 
    [Project1].[Budget] AS [Budget], 
    [Project1].[StartDate] AS [StartDate], 
    [Project1].[InstructorID] AS [InstructorID], 
    [Project1].[RowVersion] AS [RowVersion]
    FROM ( SELECT 
        [Extent1].[CourseID] AS [CourseID], 
        [Extent1].[Title] AS [Title], 
        [Extent1].[Credits] AS [Credits], 
        [Extent1].[DepartmentID] AS [DepartmentID], 
        [Extent2].[DepartmentID] AS [DepartmentID1], 
        [Extent2].[Name] AS [Name], 
        [Extent2].[Budget] AS [Budget], 
        [Extent2].[StartDate] AS [StartDate], 
        [Extent2].[InstructorID] AS [InstructorID], 
        [Extent2].[RowVersion] AS [RowVersion]
        FROM  [dbo].[Course] AS [Extent1]
        INNER JOIN [dbo].[Department] AS [Extent2] ON [Extent1].[DepartmentID] = [Extent2].[DepartmentID]
        WHERE @p__linq__0 IS NULL OR [Extent1].[DepartmentID] = @p__linq__1
    )  AS [Project1]
    ORDER BY [Project1].[CourseID] ASC

Anda bisa melihat bahwa kueri sekarang adalah JOIN kueri yang memuat data bersama dengan Course data, dan bahwa kueri tersebut menyertakan WHERE klausaDepartment.

var sql = courses.ToString() Hapus baris.

Membuat lapisan abstraksi

Banyak pengembang menulis kode untuk mengimplementasikan repositori dan unit pola kerja sebagai pembungkus di sekitar kode yang berfungsi dengan Kerangka Kerja Entitas. Pola-pola ini dimaksudkan untuk membuat lapisan abstraksi antara lapisan akses data dan lapisan logika bisnis aplikasi. Menerapkan pola ini dapat membantu mengisolasi aplikasi Anda dari perubahan di penyimpanan data dan dapat memfasilitasi pengujian unit otomatis atau pengembangan berbasis pengujian (TDD). Namun, menulis kode tambahan untuk menerapkan pola ini tidak selalu menjadi pilihan terbaik untuk aplikasi yang menggunakan EF, karena beberapa alasan:

  • Kelas konteks EF itu sendiri mengisolasi kode Anda dari kode khusus penyimpanan data.
  • Kelas konteks EF dapat bertindak sebagai kelas unit kerja untuk pembaruan database yang Anda lakukan menggunakan EF.
  • Fitur yang diperkenalkan dalam Entity Framework 6 memudahkan penerapan TDD tanpa menulis kode repositori.

Untuk informasi selengkapnya tentang cara mengimplementasikan repositori dan unit pola kerja, lihat versi Entity Framework 5 dari seri tutorial ini. Untuk informasi tentang cara menerapkan TDD di Entity Framework 6, lihat sumber daya berikut:

Kelas proksi

Ketika Kerangka Kerja Entitas membuat instans entitas (misalnya, saat Anda menjalankan kueri), Kerangka Kerja Entitas sering membuatnya sebagai instans dari jenis turunan yang dihasilkan secara dinamis yang bertindak sebagai proksi untuk entitas. Misalnya, lihat dua gambar debugger berikut. Pada gambar pertama, Anda melihat bahwa student variabel adalah jenis yang diharapkan Student segera setelah Anda membuat instans entitas. Pada gambar kedua, setelah EF digunakan untuk membaca entitas siswa dari database, Anda akan melihat kelas proksi.

Sebelum kelas proksi

Setelah kelas proksi

Kelas proksi ini mengambil alih beberapa properti virtual entitas untuk menyisipkan kait untuk melakukan tindakan secara otomatis saat properti diakses. Salah satu fungsi yang digunakan mekanisme ini adalah pemuatan malas.

Sebagian besar waktu Anda tidak perlu menyadari penggunaan proksi ini, tetapi ada pengecualian:

  • Dalam beberapa skenario, Anda mungkin ingin mencegah Kerangka Kerja Entitas membuat instans proksi. Misalnya, saat Anda menserialisasikan entitas, Anda umumnya menginginkan kelas POCO, bukan kelas proksi. Salah satu cara untuk menghindari masalah serialisasi adalah dengan membuat serialisasi objek transfer data (DTO) alih-alih objek entitas, seperti yang ditunjukkan dalam tutorial Menggunakan API Web dengan Kerangka Kerja Entitas . Cara lain adalah dengan menonaktifkan pembuatan proksi.
  • Saat Anda membuat instans kelas entitas menggunakan new operator, Anda tidak mendapatkan instans proksi. Ini berarti Anda tidak mendapatkan fungsionalitas seperti pemuatan malas dan pelacakan perubahan otomatis. Ini biasanya baik-baik saja; Anda umumnya tidak memerlukan pemuatan malas, karena Anda membuat entitas baru yang tidak ada dalam database, dan Anda umumnya tidak memerlukan pelacakan perubahan jika Anda secara eksplisit menandai entitas sebagai Added. Namun, jika Anda memerlukan pemuatan malas dan memerlukan pelacakan perubahan, Anda dapat membuat instans entitas baru dengan proksi menggunakan metode DbSetBuat kelas .
  • Anda mungkin ingin mendapatkan jenis entitas aktual dari jenis proksi. Anda dapat menggunakan metode GetObjectType dari ObjectContext kelas untuk mendapatkan jenis entitas aktual dari instans jenis proksi.

Untuk informasi selengkapnya, lihat Bekerja dengan Proksi di MSDN.

Deteksi perubahan otomatis

Kerangka Kerja Entitas menentukan bagaimana entitas telah berubah (dan oleh karena itu pembaruan mana yang perlu dikirim ke database) dengan membandingkan nilai entitas saat ini dengan nilai asli. Nilai asli disimpan saat entitas dikueri atau dilampirkan. Beberapa metode yang menyebabkan deteksi perubahan otomatis adalah sebagai berikut:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Remove
  • DbSet.Add
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Jika Anda melacak sejumlah besar entitas dan memanggil salah satu metode ini berkali-kali dalam perulangan, Anda mungkin mendapatkan peningkatan performa yang signifikan dengan menonaktifkan deteksi perubahan otomatis untuk sementara menggunakan properti AutoDetectChangesEnabled . Untuk informasi selengkapnya, lihat Mendeteksi Perubahan secara Otomatis di MSDN.

Validasi otomatis

Saat Anda memanggil SaveChanges metode , secara default Kerangka Kerja Entitas memvalidasi data di semua properti dari semua entitas yang diubah sebelum memperbarui database. Jika Anda telah memperbarui sejumlah besar entitas dan telah memvalidasi data, pekerjaan ini tidak perlu dan Anda dapat membuat proses menyimpan perubahan membutuhkan waktu lebih sedikit dengan menonaktifkan validasi untuk sementara waktu. Anda dapat melakukannya menggunakan properti ValidateOnSaveEnabled . Untuk informasi selengkapnya, lihat Validasi di MSDN.

Alat Daya Kerangka Kerja Entitas

Entity Framework Power Tools adalah add-in Visual Studio yang digunakan untuk membuat diagram model data yang ditunjukkan dalam tutorial ini. Alat ini juga dapat melakukan fungsi lain seperti menghasilkan kelas entitas berdasarkan tabel dalam database yang ada sehingga Anda dapat menggunakan database dengan Kode Pertama. Setelah Anda menginstal alat, beberapa opsi tambahan muncul di menu konteks. Misalnya, saat Anda mengklik kanan kelas konteks di Penjelajah Solusi, Anda akan melihat dan opsi Kerangka Kerja Entitas . Ini memberi Anda kemampuan untuk menghasilkan diagram. Saat menggunakan Code First, Anda tidak dapat mengubah model data dalam diagram, tetapi Anda dapat memindahkan berbagai hal untuk membuatnya lebih mudah dipahami.

Diagram EF

Kode sumber Kerangka Kerja Entitas

Kode sumber untuk Entity Framework 6 tersedia di GitHub. Anda dapat mengajukan bug, dan Anda dapat menyumbangkan penyempurnaan Anda sendiri ke kode sumber EF.

Meskipun kode sumber terbuka, Entity Framework sepenuhnya didukung sebagai produk Microsoft. Tim Microsoft Entity Framework memegang kontrol atas kontribusi mana yang diterima dan menguji semua perubahan kode untuk memastikan kualitas setiap rilis.

Ucapan terima kasih

  • Tom Dykstra menulis versi asli tutorial ini, menulis bersama pembaruan EF 5, dan menulis pembaruan EF 6. Tom adalah penulis pemrograman senior di Microsoft Web Platform and Tools Content Team.
  • Rick Anderson ( twitter @RickAndMSFT) melakukan sebagian besar pekerjaan yang memperbarui tutorial untuk EF 5 dan MVC 4 dan menulis bersama pembaruan EF 6. Rick adalah penulis pemrograman senior untuk Microsoft yang berfokus pada Azure dan MVC.
  • Rowan Miller dan anggota lain dari tim Kerangka Kerja Entitas membantu dengan ulasan kode dan membantu men-debug banyak masalah dengan migrasi yang muncul saat kami memperbarui tutorial untuk EF 5 dan EF 6.

Pemecahan masalah kesalahan umum

Tidak dapat membuat/menyalin bayangan

Pesan Kesalahan:

Tidak dapat membuat/menyalin bayangan '<nama> file' ketika file tersebut sudah ada.

Solusi

Tunggu beberapa detik dan refresh halaman.

Update-Database tidak dikenali

Pesan Kesalahan (dari Update-Database perintah di PMC):

Istilah 'Update-Database' tidak dikenali sebagai nama cmdlet, fungsi, file skrip, atau program yang dapat dioperasikan. Periksa ejaan nama, atau jika jalur disertakan, verifikasi bahwa jalur tersebut benar dan coba lagi.

Solusi

Keluar dari Visual Studio. Buka kembali proyek dan coba lagi.

Validasi gagal

Pesan Kesalahan (dari Update-Database perintah di PMC):

Validasi gagal untuk satu atau beberapa entitas. Lihat properti 'EntityValidationErrors' untuk detail selengkapnya.

Solusi

Salah satu penyebab masalah ini adalah kesalahan validasi ketika Seed metode berjalan. Lihat Seeding dan Debugging Entity Framework (EF) DB untuk tips tentang penelusuran kesalahan Seed metode.

Kesalahan HTTP 500.19

Pesan Kesalahan:

Kesalahan HTTP 500.19 - Kesalahan Server Internal Halaman yang diminta tidak dapat diakses karena data konfigurasi terkait untuk halaman tidak valid.

Solusi

Salah satu cara Anda bisa mendapatkan kesalahan ini adalah dengan memiliki beberapa salinan solusi, masing-masing menggunakan nomor port yang sama. Anda biasanya dapat menyelesaikan masalah ini dengan keluar dari semua instans Visual Studio, lalu memulai ulang proyek yang sedang Anda kerjakan. Jika tidak berhasil, coba ubah nomor port. Klik kanan pada file proyek lalu klik properti. Pilih tab Web lalu ubah nomor port dalam kotak teks Url Proyek .

Kesalahan menemukan instans SQL Server

Pesan Kesalahan:

Timbul kesalahan terkait jaringan atau spesifik instans saat membuat sambungan ke SQL Server. Server tak ditemukan atau tak bisa diakses. Verifikasi bahwa nama instans sudah benar dan SQL Server dikonfigurasi untuk memungkinkan koneksi jarak jauh. (penyedia: Antarmuka Jaringan SQL Server, kesalahan: 26 - Kesalahan Menemukan Server/instans yang ditentukan)

Solusi

Periksa string koneksi. Jika Anda telah menghapus database secara manual, ubah nama database dalam string konstruksi.

Mendapatkan kode

Unduh Proyek yang Selesai

Sumber Daya Tambahan:

Untuk informasi selengkapnya tentang cara bekerja dengan data menggunakan Kerangka Kerja Entitas, lihat halaman dokumentasi EF di MSDN dan ASP.NET Akses Data - Sumber Daya yang Direkomendasikan.

Untuk informasi selengkapnya tentang cara menyebarkan aplikasi web setelah Anda membuatnya, lihat ASP.NET Penyebaran Web - Sumber Daya yang Direkomendasikan di Pustaka MSDN.

Untuk informasi tentang topik lain yang terkait dengan MVC, seperti autentikasi dan otorisasi, lihat ASP.NET MVC - Sumber Daya yang Direkomendasikan.

Langkah berikutnya

Di tutorial ini, Anda akan:

  • Kueri SQL mentah yang dilakukan
  • Melakukan kueri tanpa pelacakan
  • Kueri SQL yang diperiksa dikirim ke database

Anda juga mempelajari tentang:

  • Membuat lapisan abstraksi
  • Kelas proksi
  • Deteksi perubahan otomatis
  • Validasi otomatis
  • Alat Daya Kerangka Kerja Entitas
  • Kode sumber Kerangka Kerja Entitas

Ini menyelesaikan rangkaian tutorial ini tentang menggunakan Kerangka Kerja Entitas dalam aplikasi MVC ASP.NET. Jika Anda ingin mempelajari tentang EF Database First, lihat seri tutorial DB First.