Bagikan melalui


Konfigurasi berbasis kode

Catatan

Hanya EF6 dan seterusnya - Fitur, API, dll. yang dibahas di halaman ini dimasukkan dalam Entity Framework 6. Jika Anda menggunakan versi yang lebih lama, beberapa atau semua informasi tidak berlaku.

Konfigurasi untuk aplikasi Entity Framework dapat ditentukan dalam file konfigurasi (app.config/web.config) atau melalui kode. Yang terakhir dikenal sebagai konfigurasi berbasis kode.

Konfigurasi dalam file konfigurasi dijelaskan dalam artikel terpisah. File konfigurasi lebih diutamakan daripada konfigurasi berbasis kode. Dengan kata lain, jika opsi konfigurasi diatur dalam kode dan dalam file konfigurasi, maka pengaturan dalam file konfigurasi digunakan.

Menggunakan DbConfiguration

Konfigurasi berbasis kode di EF6 ke atas dicapai dengan membuat subkelas .System.Data.Entity.Config.DbConfiguration Panduan berikut harus diikuti saat subkelas DbConfiguration:

  • Buat hanya satu DbConfiguration kelas untuk aplikasi Anda. Kelas ini menentukan pengaturan luas domain aplikasi.
  • Tempatkan kelas Anda DbConfiguration di rakitan yang sama dengan kelas Anda DbContext . (Lihat Memindahkan DbConfiguration bagian jika Anda ingin mengubah ini.)
  • Beri kelas Anda DbConfiguration konstruktor tanpa parameter publik.
  • Atur opsi konfigurasi dengan memanggil metode yang dilindungi DbConfiguration dari dalam konstruktor ini.

Mengikuti panduan ini memungkinkan EF untuk menemukan dan menggunakan konfigurasi Anda secara otomatis dengan alat yang perlu mengakses model Anda dan kapan aplikasi Anda dijalankan.

Contoh

Kelas yang berasal dari DbConfiguration mungkin terlihat seperti ini:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;

namespace MyNamespace
{
    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
            SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
        }
    }
}

Kelas ini menyiapkan EF untuk menggunakan strategi eksekusi SQL Azure - untuk mencoba kembali operasi database yang gagal secara otomatis - dan menggunakan DB Lokal untuk database yang dibuat oleh konvensi dari Code First.

Bergerak DbConfiguration

Ada kasus di mana tidak mungkin untuk menempatkan kelas Anda DbConfiguration di rakitan yang sama dengan kelas Anda DbContext . Misalnya, Anda mungkin memiliki dua DbContext kelas masing-masing di rakitan yang berbeda. Ada dua opsi untuk menangani ini.

Opsi pertama adalah menggunakan file konfigurasi untuk menentukan instans yang DbConfiguration akan digunakan. Untuk melakukan ini, atur atribut codeConfigurationType dari bagian entityFramework. Contohnya:

<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
    ...Your EF config...
</entityFramework>

Nilai codeConfigurationType harus berupa nama assembly dan namespace yang memenuhi syarat dari kelas Anda DbConfiguration .

Opsi kedua adalah menempatkan DbConfigurationTypeAttribute pada kelas konteks Anda. Contohnya:

[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}

Nilai yang diteruskan ke atribut dapat berupa jenis Anda DbConfiguration - seperti yang ditunjukkan di atas - atau string nama jenis assembly dan namespace yang memenuhi syarat. Contohnya:

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}

Mengatur DbConfiguration secara eksplisit

Ada beberapa situasi di mana konfigurasi mungkin diperlukan sebelum jenis apa pun DbContext telah digunakan. Contohnya meliputi:

  • Menggunakan DbModelBuilder untuk membangun model tanpa konteks
  • Menggunakan beberapa kode kerangka kerja/utilitas lain yang menggunakan DbContext tempat konteks tersebut digunakan sebelum konteks aplikasi Anda digunakan

Dalam situasi seperti itu EF tidak dapat menemukan konfigurasi secara otomatis dan Anda harus melakukan salah satu hal berikut:

  • Atur DbConfiguration jenis dalam file konfigurasi, seperti yang dijelaskan di bagian Memindahkan DbConfiguration di atas
  • Panggil statis DbConfiguration. Metode SetConfiguration selama startup aplikasi

Override DbConfiguration

Ada beberapa situasi di mana Anda perlu mengambil alih konfigurasi yang ditetapkan di DbConfiguration. Ini biasanya tidak dilakukan oleh pengembang aplikasi melainkan oleh penyedia pihak ketiga dan plug-in yang tidak dapat menggunakan kelas turunan DbConfiguration .

Untuk ini, EntityFramework memungkinkan penanganan aktivitas didaftarkan yang dapat memodifikasi konfigurasi yang ada tepat sebelum dikunci. Ini juga menyediakan metode gula khusus untuk mengganti layanan apa pun yang dikembalikan oleh pencari layanan EF. Ini adalah cara yang dimaksudkan untuk digunakan:

  • Pada pengaktifan aplikasi (sebelum EF digunakan) plug-in atau penyedia harus mendaftarkan metode penanganan aktivitas untuk peristiwa ini. (Perhatikan bahwa ini harus terjadi sebelum aplikasi menggunakan EF.)
  • Penanganan aktivitas melakukan panggilan ke ReplaceService untuk setiap layanan yang perlu diganti.

Misalnya, untuk mengganti IDbConnectionFactory dan DbProviderService Anda akan mendaftarkan handler seperti ini:

DbConfiguration.Loaded += (_, a) =>
   {
       a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
       a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
   };

Dalam kode di atas, MyProviderServices dan MyConnectionFactory mewakili implementasi layanan Anda.

Anda juga dapat menambahkan handler dependensi tambahan untuk mendapatkan efek yang sama.

Perhatikan bahwa Anda juga dapat membungkus DbProviderFactory dengan cara ini, tetapi melakukannya hanya akan memengaruhi EF dan tidak menggunakan DbProviderFactory bagian luar EF. Untuk alasan ini Anda mungkin ingin terus membungkus DbProviderFactory seperti yang Anda miliki sebelumnya.

Anda juga harus mengingat layanan yang Anda jalankan secara eksternal ke aplikasi Anda - misalnya, saat menjalankan migrasi dari Package Manager Console. Ketika Anda menjalankan migrasi dari konsol, ia akan mencoba menemukan DbConfiguration. Namun, apakah itu akan mendapatkan layanan yang dibungkus atau tidak tergantung pada di mana penanganan aktivitas didaftarkannya. Jika terdaftar sebagai bagian dari konstruksi Anda DbConfiguration , maka kode harus dijalankan dan layanan harus dibungkus. Biasanya ini tidak akan terjadi dan ini berarti bahwa alat tidak akan mendapatkan layanan yang dibungkus.