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.
Video dan panduan langkah demi langkah ini memberikan pengantar pengembangan Code First yang menargetkan database baru. Skenario ini termasuk menargetkan database yang tidak ada dan Code First akan membuat, atau database kosong tempat Code First akan menambahkan tabel baru. Code First memungkinkan Anda menentukan model menggunakan kelas C# atau VB.Net. Konfigurasi tambahan secara opsional dapat dilakukan menggunakan atribut pada kelas dan properti Anda atau dengan menggunakan API yang fasih.
Tonton video
Video ini menyediakan pengantar pengembangan Code First yang menargetkan database baru. Skenario ini termasuk menargetkan database yang tidak ada dan Code First akan membuat, atau database kosong tempat Code First akan menambahkan tabel baru. Code First memungkinkan Anda menentukan model menggunakan kelas C# atau VB.Net. Konfigurasi tambahan secara opsional dapat dilakukan menggunakan atribut pada kelas dan properti Anda atau dengan menggunakan API yang fasih.
Disajikan oleh: Rowan Miller
Prasyarat
Anda harus menginstal setidaknya Visual Studio 2010 atau Visual Studio 2012 untuk menyelesaikan panduan ini.
Jika Anda menggunakan Visual Studio 2010, Anda juga harus menginstal NuGet .
1. Buat Aplikasi
Untuk menjaga hal-hal sederhana, kita akan membangun aplikasi konsol dasar yang menggunakan Kode Pertama untuk melakukan akses data.
- Membuka Visual Studio
- File -> Proyek Baru ->...
- Pilih Windows dari menu sebelah kiri dan Aplikasi Konsol
- Masukkan CodeFirstNewDatabaseSample sebagai nama
- Pilih OK
2. Buat Model
Mari kita tentukan model yang sangat sederhana menggunakan kelas. Kami hanya mendefinisikannya dalam file Program.cs tetapi dalam aplikasi dunia nyata Anda akan membagi kelas Anda menjadi file terpisah dan berpotensi proyek terpisah.
Di bawah definisi kelas Program di Program.cs tambahkan dua kelas berikut.
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
Anda akan menyadari bahwa kami membuat dua properti navigasi (Blog.Posts dan Post.Blog) menjadi virtual. Ini memungkinkan fitur Lazy Loading dari Entity Framework. Pemuatan Malas berarti bahwa konten properti ini akan dimuat secara otomatis dari database saat Anda mencoba mengaksesnya.
3. Buat Konteks
Sekarang saatnya untuk menentukan konteks turunan, yang mewakili sesi dengan database, memungkinkan kami untuk mengkueri dan menyimpan data. Kami menentukan konteks yang berasal dari System.Data.Entity.DbContext dan mengekspos DbSet<TEntity> yang ditik untuk setiap kelas dalam model kami.
Kita sekarang mulai menggunakan jenis dari Kerangka Kerja Entitas sehingga kita perlu menambahkan paket EntityFramework NuGet.
- Project –> Kelola Paket NuGet... Catatan: Jika Anda tidak memiliki opsi Kelola Paket NuGet... Anda harus menginstal versi terbaru NuGet
- Pilih tab Online
- Pilih paket EntityFramework
- Klik Instal
Tambahkan pernyataan penggunaan untuk System.Data.Entity di bagian atas Program.cs.
using System.Data.Entity;
Di bawah kelas Post di Program.cs tambahkan konteks turunan berikut.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Berikut adalah daftar lengkap tentang apa yang harus dimuat Program.cs sekarang.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace CodeFirstNewDatabaseSample
{
class Program
{
static void Main(string[] args)
{
}
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
Itu saja kode yang kita butuhkan untuk mulai menyimpan dan mengambil data. Jelas ada cukup banyak yang terjadi di belakang layar dan kita akan melihat itu dalam sesaat, tetapi sebelumnya mari kita lihat dalam praktik.
4. Membaca & Menulis Data
Terapkan metode Utama dalam Program.cs seperti yang ditunjukkan di bawah ini. Kode ini membuat instans baru dari konteks kami dan kemudian menggunakannya untuk menyisipkan Blog baru. Kemudian menggunakan kueri LINQ untuk mengambil semua Blog dari database yang diurutkan menurut abjad menurut Judul.
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Anda sekarang dapat menjalankan aplikasi dan mengujinya.
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...
Di mana Data Saya?
Menurut konvensi DbContext telah membuat database untuk Anda.
- Jika instans SQL Express lokal tersedia (diinstal secara default dengan Visual Studio 2010) maka Code First telah membuat database pada instans tersebut
- Jika SQL Express tidak tersedia, Code First akan mencoba dan menggunakan LocalDB (diinstal secara default dengan Visual Studio 2012)
- Database dinamai sesuai dengan nama konteks turunan yang sepenuhnya memenuhi syarat, dalam kasus kami yaitu CodeFirstNewDatabaseSample.BloggingContext
Ini hanyalah konvensi default dan ada berbagai cara untuk mengubah database yang digunakan Code First, informasi lebih lanjut tersedia dalam topik Cara DbContext Menemukan Model dan Koneksi Database . Anda dapat menyambungkan ke database ini menggunakan Server Explorer di Visual Studio
Tampilan -> Penjelajah Server
Klik kanan pada Koneksi Data dan pilih Tambahkan Koneksi...
Jika Anda belum tersambung ke database dari Server Explorer sebelum Anda harus memilih Microsoft SQL Server sebagai sumber data
Sambungkan ke LocalDB atau SQL Express, tergantung pada yang telah Anda instal
Kita sekarang dapat memeriksa skema yang dibuat Kode Pertama.
DbContext mencari tahu kelas apa yang akan disertakan dalam model dengan melihat properti DbSet yang kami tentukan. Kemudian menggunakan kumpulan default konvensi Code First untuk menentukan nama tabel dan kolom, menentukan jenis data, menemukan kunci primer, dll. Nanti dalam panduan ini kita akan melihat bagaimana Anda dapat mengambil alih konvensi ini.
5. Menangani Perubahan Model
Sekarang saatnya untuk membuat beberapa perubahan pada model kita, ketika kita membuat perubahan ini kita juga perlu memperbarui skema database. Untuk melakukan ini, kami akan menggunakan fitur yang disebut Migrasi Pertama Kode, atau Migrasi singkatnya.
Migrasi memungkinkan kami memiliki serangkaian langkah yang diurutkan yang menjelaskan cara meningkatkan (dan menurunkan) skema database kami. Masing-masing langkah ini, yang dikenal sebagai migrasi, berisi beberapa kode yang menjelaskan perubahan yang akan diterapkan.
Langkah pertama adalah mengaktifkan Migrasi Pertama Kode untuk BloggingContext kami.
Peralatan -> Manajer Paket Pustaka -> Manajer Paket Konsol
Jalankan perintah Enable-Migrations di Package Manager Console
Folder Migrasi baru telah ditambahkan ke proyek kami yang berisi dua item:
- Configuration.cs - File ini berisi pengaturan yang akan digunakan Migrasi untuk memigrasikan BloggingContext. Kami tidak perlu mengubah apa pun untuk panduan ini, tetapi di sinilah Anda dapat menentukan data awal, mendaftarkan penyedia bagi basis data lainnya, mengubah namespace tempat migrasi dihasilkan, dll.
- <timestamp>_InitialCreate.cs - Ini adalah migrasi pertama Anda, yang mewakili perubahan yang telah diterapkan pada database dari yang kosong menjadi yang menyertakan tabel Blog dan Post. Meskipun kita membiarkan Code First secara otomatis membuat tabel ini untuk kita, sekarang karena kita telah memilih untuk menggunakan Migrasi, tabel-tabel tersebut telah menjadi bagian dari Migrasi. Code First juga telah merekam dalam database lokal kami bahwa Migrasi ini telah diterapkan. Tanda waktu pada nama file digunakan untuk tujuan pemesanan.
Sekarang mari kita buat perubahan pada model kita, tambahkan properti Url ke kelas Blog:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public virtual List<Post> Posts { get; set; }
}
- Jalankan perintah Add-Migration AddUrl di Konsol Manajer Paket. Perintah Add-Migration memeriksa perubahan sejak migrasi terakhir Anda dan membuat perancah migrasi baru dengan perubahan apa pun yang ditemukan. Kita dapat memberi nama migrasi; dalam hal ini kami memanggil migrasi 'AddUrl'. Kode perancah mengatakan bahwa kita perlu menambahkan kolom Url, yang dapat menyimpan data string, ke tabel dbo.Blogs. Jika diperlukan, kita dapat mengedit kode scaffolding tetapi hal tersebut tidak diperlukan dalam kasus ini.
namespace CodeFirstNewDatabaseSample.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddUrl : DbMigration
{
public override void Up()
{
AddColumn("dbo.Blogs", "Url", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Blogs", "Url");
}
}
}
- Jalankan perintah Update-Database di Package Manager Console. Perintah ini akan menerapkan migrasi tertunda ke basis data. Migrasi InitialCreate kami telah diterapkan, sehingga selanjutnya hanya akan menerapkan migrasi AddUrl baru kami. Tips: Anda dapat menggunakan sakelar –Verbose saat memanggil Update-Database untuk melihat SQL yang sedang dijalankan terhadap database.
Kolom Url baru sekarang ditambahkan ke tabel Blog dalam database:
6. Anotasi Data
Sejauh ini kita hanya membiarkan EF menemukan model menggunakan konvensi defaultnya, tetapi akan ada saat-saat ketika kelas kita tidak mengikuti konvensi dan kita harus dapat melakukan konfigurasi lebih lanjut. Ada dua opsi untuk ini; kita akan melihat Anotasi Data di bagian ini dan kemudian API fasih di bagian berikutnya.
- Mari kita tambahkan kelas Pengguna ke model kita
public class User
{
public string Username { get; set; }
public string DisplayName { get; set; }
}
- Kita juga perlu menambahkan sebuah kumpulan ke dalam konteks turunan kita
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
}
- Jika kami mencoba menambahkan migrasi, kami akan mendapatkan kesalahan yang mengatakan "EntityType 'User' tidak memiliki kunci yang ditentukan. Tentukan kunci untuk EntityType ini." karena EF tidak memiliki cara untuk mengetahui bahwa Nama Pengguna harus menjadi kunci utama bagi Pengguna.
- Kita akan menggunakan Anotasi Data sekarang jadi kita perlu menambahkan pernyataan penggunaan di bagian atas Program.cs
using System.ComponentModel.DataAnnotations;
- Sekarang anotasi properti Nama Pengguna untuk mengidentifikasi bahwa itu adalah kunci utama
public class User
{
[Key]
public string Username { get; set; }
public string DisplayName { get; set; }
}
- Gunakan perintah Add-Migration AddUser untuk membuat perancah migrasi untuk menerapkan perubahan ini ke database
- Jalankan perintah Update-Database untuk menerapkan migrasi baru ke database
Tabel baru sekarang ditambahkan ke database:
Daftar lengkap anotasi yang didukung oleh EF adalah:
- KeyAttribute
- StringLengthAttribute
- MaxLengthAttribute
- ConcurrencyCheckAttribute
- RequiredAttribute
- TimestampAttribute
- ComplexTypeAttribute
- ColumnAttribute
- TableAttribute
- InversePropertyAttribute
- ForeignKeyAttribute
- DatabaseGeneratedAttribute
- NotMappedAttribute
7. API Fluent
Di bagian sebelumnya, kita melihat cara menggunakan Anotasi Data untuk melengkapi atau mengganti apa yang terdeteksi oleh konvensi. Cara lain untuk mengonfigurasi model adalah melalui CODE First fluent API.
Sebagian besar konfigurasi model dapat dilakukan menggunakan anotasi data sederhana. API fluent adalah cara yang lebih maju untuk menentukan konfigurasi model yang mencakup semua yang dapat dilakukan oleh anotasi data, serta beberapa konfigurasi lebih lanjut yang tidak mungkin dilakukan dengan anotasi data. Anotasi data dan API fasih dapat digunakan bersama-sama.
Untuk mengakses fluent API, Anda mengganti metode OnModelCreating di DbContext. Katakanlah kita ingin mengganti nama kolom tempat User.DisplayName disimpan ke display_name.
- Ambil alih metode OnModelCreating di BloggingContext dengan kode berikut
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Property(u => u.DisplayName)
.HasColumnName("display_name");
}
}
- Gunakan perintah Add-Migration ChangeDisplayName untuk membuat perancah migrasi untuk menerapkan perubahan ini ke database.
- Jalankan perintah Update-Database untuk menerapkan migrasi baru ke database.
Kolom DisplayName sekarang diganti namanya menjadi display_name:
RINGKASAN
Dalam panduan ini kita melihat pengembangan Kode Pertama menggunakan database baru. Kami mendefinisikan model menggunakan kelas kemudian menggunakan model tersebut untuk membuat database dan menyimpan dan mengambil data. Setelah database dibuat, kami menggunakan Migrasi Pertama Kode untuk mengubah skema saat model kami berevolusi. Kami juga melihat cara mengonfigurasi model dengan Anotasi Data dan Fluent API.