Bagikan melalui


Kode Pertama ke Database Baru

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

Video: WMV | MP4 | WMV (ZIP)

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 -> Baru -> Proyek
  • 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 menjadi 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 melihat bahwa kami membuat dua properti navigasi (Blog.Posts dan Post.Blog) virtual. Ini memungkinkan fitur Pemuatan Malas 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 dikandung 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 sedikit yang terjadi di belakang layar dan kita akan melihat itu dalam sesaat tetapi pertama-tama mari kita lihat dalam tindakan.

4. Membaca & Menulis Data

Terapkan metode Utama di 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 Bagaimana DbContext Menemukan model dan database Koneksi ion. Anda dapat menyambungkan ke database ini menggunakan Server Explorer di Visual Studio

  • Tampilan -> Penjelajah Server

  • Klik kanan Koneksi data dan pilih Tambahkan Koneksi ion...

  • Jika Anda belum tersambung ke database dari Server Explorer sebelum Anda harus memilih Microsoft SQL Server sebagai sumber data

    Select Data Source

  • Koneksi ke LocalDB atau SQL Express, tergantung pada yang telah Anda instal

Kita sekarang dapat memeriksa skema yang dibuat Kode Pertama.

Schema Initial

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.

  • Alat -> Manajer Paket Pustaka -> Konsol Manajer Paket

  • Jalankan perintah Enable-Migrations di Konsol Manajer Paket

  • 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 benih, mendaftarkan penyedia untuk database lain, mengubah namespace layanan yang dihasilkan migrasi di dll.
    • <timestamp>_InitialCreate.cs - Ini adalah migrasi pertama Anda, ini mewakili perubahan yang telah diterapkan ke database untuk membuatnya menjadi database kosong ke database yang menyertakan tabel Blog dan Posting. Meskipun kita membiarkan Code First secara otomatis membuat tabel ini untuk kita, sekarang kita telah memilih untuk Migrasi mereka telah dikonversi menjadi 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 Package Manager Console. 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 dbo. Tabel blog. Jika diperlukan, kita dapat mengedit kode perancah tetapi itu 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 yang tertunda ke database. Migrasi InitialCreate kami telah diterapkan sehingga migrasi 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:

Schema With Url

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 satu set ke 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:

Schema With Users

Daftar lengkap anotasi yang didukung oleh EF adalah:

7. API Fasih

Di bagian sebelumnya kita melihat menggunakan Anotasi Data untuk melengkapi atau mengambil alih 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 fasih adalah cara yang lebih canggih untuk menentukan konfigurasi model yang mencakup semua yang dapat dilakukan anotasi data selain beberapa konfigurasi yang lebih canggih tidak mungkin dengan anotasi data. Anotasi data dan API fasih dapat digunakan bersama-sama.

Untuk mengakses API fasih, Anda mengambil alih 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:

Schema With Display Name Renamed

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 menggunakan Anotasi Data dan API Fasih.