Model yang mendukung konteks <Database> telah berubah sejak database dibuat


253

Pesan kesalahan:

"Model yang mendukung konteks 'AddressBook' telah berubah sejak database dibuat. Entah menghapus / memperbarui database secara manual, atau memanggil Database.SetInitializer dengan instance IDatabaseInitializer. Misalnya, strategi RecreateDatabaseIfModelChanges secara otomatis akan menghapus dan membuat ulang database, dan secara opsional seeded dengan data baru. "

Saya mencoba menggunakan fitur kode-pertama dan berikut ini yang saya tulis:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

Kelas konteks:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

dan string koneksi:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

Jadi, nama database adalah "AddressBook" dan kesalahan terjadi ketika saya mencoba menambahkan objek kontak ke konteksnya. Apakah saya kehilangan sesuatu di sini?



Hapus tabel __MigrationHistory dari database Anda
Zahid Hasan

Jawaban:


397

Sekarang ini:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

dalam file YourDbContext.cs Anda.


Saya telah mengubah db produksi saya secara manual dan mematikan migrasi dan berfungsi, Terima kasih
Mohsen Afshin

13
Ps, ini berlaku di Global.asax Application_Start ()
BritishDeveloper

48
Lebih baik daripada Global.asax adalah menempatkan ini dalam konstruktor kelas DbContext Anda. Dengan begitu ia bekerja untuk setiap situs menggunakan konteks daripada hanya satu situs yang dikendalikan oleh file Global.asax.
Corin

7
Mungkin lebih baik untuk meletakkannya di kontruktor statis dari kelas konteks sehingga hanya dipanggil sekali - seperti dalam contoh video ini: msdn.microsoft.com/en-us/data/jj572367
Christian Fredh

3
Itu harus ditempatkan di dalam override yang dilindungi void OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); base.OnModelCreating (modelBuilder); }
Chris Voon

135

Berikut beberapa informasi dari Blog Scott Gu yang diposting oleh Jeff tentang apa yang sebenarnya terjadi:

Bagi mereka yang melihat pengecualian ini:

"Model yang mendukung konteks 'Produksi' telah berubah sejak database dibuat. Entah menghapus / memperbarui database secara manual, atau menelepon Database.SetInitializerdengan IDatabaseInitializerinstance."

Inilah yang sedang terjadi dan apa yang harus dilakukan tentang hal itu:

Ketika model pertama kali dibuat, kami menjalankan DatabaseInitializer untuk melakukan hal-hal seperti membuat database jika tidak ada atau menambahkan data awal. DatabaseInitializer default mencoba untuk membandingkan skema database yang diperlukan untuk menggunakan model dengan hash dari skema yang disimpan dalam tabel EdmMetadata yang dibuat dengan database (ketika Code First adalah yang membuat database). Database yang ada tidak akan memiliki tabel EdmMetadata dan karenanya tidak akan memiliki hash ... dan implementasinya hari ini akan melempar jika tabel itu hilang. Kami akan berupaya mengubah perilaku ini sebelum kami mengirimkan versi fial karena ini adalah default. Sampai saat itu, basis data yang ada umumnya tidak memerlukan penginisialisasi basis data sehingga dapat dimatikan untuk jenis konteks Anda dengan memanggil:

Database.SetInitializer<YourDbContext>(null);

Jeff


9
Saya mencoba ini hari ini, dan saya tidak lagi mendapatkan "Model telah berubah", sebaliknya saya mendapatkan "Nama objek tidak valid 'dbo.Tabel'"
Stefan Bergfeldt

3
Jeff ingin ini menjadi solusi tetapi sudah lebih dari dua tahun sejak dan SetInitializer ke null masih diperlukan. Baik? Jadi, bisakah seseorang menjelaskan bagaimana ini cocok dengan alur kerja migrasi.
kroiz

2
@ jakejgordon: Saya juga dengan EF6 tetapi jika itu ada di Global.asax, itu hanya memperbaiki masalah ketika menjalankan situs web. Jika Anda memiliki tes unit, Anda OOL. Lebih baik letakkan di konstruktor YourDbContext. Itu memperbaikinya untuk setiap proyek, termasuk situs web dan proyek pengujian.
Rap

1
IMO, jawaban ini harus diberi skor lebih tinggi karena sebenarnya menjelaskan mengapa kita perlu menambahkan baris kode ini. Terima kasih.
Paul

1
@StefanBergfeldt jika Anda atau siapa pun mendapatkan Invalid object name 'dbo.Tablecek string koneksi Anda attachDbFilename dan katalog awal
benscabbia

41

Untuk Entity Framework 5.0.0.0 - 6.1.3

Anda DO memang ingin melakukan hal berikut:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

Ya, Matt Frear benar. UPDATE -EDIT: Peringatan adalah bahwa saya setuju dengan orang lain dalam bahwa alih-alih menambahkan kode ini ke global.asax ditambahkan ke kelas DbContext Anda

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

Seperti yang disebutkan lainnya, ini juga baik untuk menangani pengujian unit.

Saat ini saya menggunakan ini dengan Entity Framework 6.1.3 /.net 4.6.1

Saya akan kembali untuk memberikan cuplikan INTI dalam waktu dekat.


1
Terima kasih! Program.cs pasti berfungsi untuk konsol.
Hoki

Tetapi ketika Anda pertama kali menginisialisasi database Anda maka itu tidak membuat database jika saya meletakkan null setinitializer pada metode onModelCreating. Adakah pikiran? Eventhoug saya lakukan menggunakan (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Rupesh Kumar Tiwari

Saya perlu menemukan kode saya yang akan saya gunakan yang kadang-kadang saya komentari baris dan swap ... Saya tidak ingat begitu saja masalah, saya perlu melihat.
Tom Stickel

1
Solusi terbaik. Itu menyebabkan solusi saya berjalan, dan saya tidak tahu apa akibatnya. Berkomitmen dan gunakan.
Svend

32

Jalankan perintah followng sql di SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]

1
Anda menyelamatkan hidup saya! Terima kasih.
Marek Dorda

31

Perbaikan ini tidak lagi berfungsi setelah CTP5.

Kamu harus melakukan Database.SetInitializer<YourContext>(null);


1
Ke mana perginya ... OnModelCreating tidak dapat diakses apa pun yang disebut DbDatabase
James Reategui

Di suatu tempat di startup, saya mengatur milik saya di Application_Start.
chrisortman

Database.SetInitializer tampaknya berfungsi dengan baik dalam rilis final EF 4.3.
Richard Beier

Saya berasumsi bahwa "Perbaikan ini tidak lagi berfungsi setelah CTP5" berarti bahwa jawaban yang Diterima mulai 30 Agustus 2010 adalah apa yang ia katakan.
Tom Stickel

19

Baru saja menemukan jawaban dan pemikiran untuk memperbarui di sini. Hanya perlu melakukan hal berikut.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

12
Ini tidak lagi mungkin dengan versi EF yang lebih baru, juga modelBuilder.Conventions.Remove<IncludeMetadataConvention>();tidak membantu situasi. DbDatabase.SetInitialzer (null); tidak bekerja.
JTew

@ TomStickel - Saya setuju. Ditandai stackoverflow.com/a/6143116/255562 sebagai jawabannya.
Ashish Gupta

16

Atau Anda dapat meletakkan baris ini di file Global.asax.cs Anda di bawah Application_Start ():

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

Pastikan untuk mengubah ProjectName.Path.Context ke namespace dan konteks Anda. Jika menggunakan kode terlebih dahulu, ini akan menghapus dan membuat database baru setiap kali ada perubahan pada skema.


Persis seperti yang saya butuhkan, karena saya hanya melakukan prototyping. Terima kasih banyak.
Learner

8

Saya menghabiskan banyak hari untuk menyelesaikan masalah ini, menganalisis banyak posting berbeda dan mencoba banyak opsi dan akhirnya memperbaiki. Ini 2 proyek dalam solusi saya menggunakan migrasi kode EF pertama:

  • Aplikasi Konsol "DataModel" yang terutama digunakan sebagai rakitan yang berisi semua entitas pertama kode saya, DbContext, Mirgations, dan repositori generik. Saya telah memasukkan ke dalam proyek ini file database lokal kosong yang terpisah (dalam folder DataModel / App_Data) untuk dapat menghasilkan migrasi dari Package Manager Console.
  • WebApi, yang merujuk ke proyek DataModel dan menggunakan file database lokal dari folder WebApi / App_Data, yang tidak termasuk dalam proyek

Saya mendapatkan kesalahan ini ketika diminta WebApi ...

Lingkungan saya:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional dengan Pembaruan 1
  • semua proyek saya ditargetkan untuk .NET Framework 4.6.1
  • EntityFramework 6.1.3 dari NuGet

Di sini saya mengumpulkan semua komentar yang harus Anda perhatikan dan semua kondisi / persyaratan yang harus dipenuhi, untuk menghindari pengecualian yang disebutkan:

  1. Anda harus menggunakan hanya satu versi paket EntityFramework Nuget untuk semua proyek dalam solusi Anda.
  2. Basis data, dibuat dengan menjalankan secara berurutan semua skrip migrasi harus memiliki struktur / skema yang sama dengan basis data target Anda dan sesuai dengan model entitas. Mengikuti 3 hal harus benar-benar sesuai / mencerminkan / cocok satu sama lain:
    • Skrip migrasi semua Anda hingga yang terakhir
    • Status model entitas entitas pertama kode (DbContext, entitas)
    • Database target
  3. Database target (file mdf) harus diperbarui / sesuai dengan skrip migrasi terakhir. Verifikasi bahwa tabel "__MigrationHistory" di database target Anda berisi catatan untuk semua skrip migrasi yang Anda miliki, itu berarti bahwa semua skrip migrasi berhasil diterapkan ke database itu. Saya merekomendasikan Anda untuk menggunakan Visual Studio untuk membuat entitas pertama yang benar kode dan konteks yang sesuai dengan database Anda, Proyek -> Tambahkan Item Baru -> Model Data Entitas ADO.NET -> Kode Pertama dari database: Tentu saja, sebagai alternatif, jika Anda tidak memiliki database, Anda dapat menulis model secara manual (kode entitas pertama dan konteks) dan kemudian menghasilkan migrasi dan database awal.
  4. Nama string koneksi mis. MyConnectionString dalam file konfigurasi proyek startup (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>

    harus sama dengan parameter yang diteruskan dalam konstruktor DbContext Anda:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Sebelum menggunakan Package Manager Console , pastikan Anda menggunakan database yang benar untuk memperbarui atau menghasilkan migrasi dan proyek yang diperlukan ditetapkan sebagai proyek startup solusi. Untuk terhubung ke basis data, ia akan menggunakan string koneksi dari file .config, yang dalam proyek, yang ditetapkan sebagai proyek startup.
  6. Dan yang utama, yang memperbaiki masalah saya: Aneh, tetapi di folder WebApi / bin saya DataModel.exe sudah tua, tidak disegarkan sejak pembangunan terakhir. Karena migrasi tertanam di perakitan DataModel.exe saya, maka WebApi saya memperbarui database menggunakan mirgations lama. Saya bingung mengapa setelah memperbarui database di WebApi tidak sesuai dengan skrip migrasi terbaru dari DataModel. Kode berikut secara otomatis membuat (jika tidak ada) atau memperbarui ke database lokal migrasi terbaru di folder WebApi / App_Data saya.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...

    Saya mencoba membersihkan dan membangun kembali solusi tetapi tidak membantu, daripada saya sepenuhnya menghapus folder bin dan obj dari WebApi, menghapus file database dari WebApi / App_Data, membangun, me-restart WebApi, membuat permintaan, membuat database yang benar - inisialisasi malas (menggunakan inisialisasi baris di atas), yang terkait dengan migrasi terbaru dan pengecualian tidak muncul lagi. Jadi, ini dapat memperbaiki masalah Anda:

    1. menghapus secara manual, folder obj dari proyek startup Anda (yang menghasilkan / memperbarui database Anda)
    2. bangun proyek startup Anda atau lebih baik bersihkan dan bangun kembali semua solusi Anda.
    3. buat ulang basis data dengan memulai proyek (akan mengeksekusi baris di atas) atau menggunakan perintah Package Manager Console "update-database".
    4. memeriksa secara manual apakah db dan __MirgationHistory yang dihasilkan sesuai dengan skrip migrasi terbaru.

5

Bagi saya, dengan upgrade ke 4.3.1, saya hanya memotong tabel EdmMetaData atau hanya menghapusnya saja.


Saya memperbarui ke 4.3.1 dan kemudian mengganti nama tabel EdmMaetaData. Saya sekarang dapat melakukan perubahan pada model sesuai kebutuhan dan tidak ada lagi pesan kesalahan yang mengganggu tentang model yang mendukung bla bla.
Ashok Padmanabhan

3

Untuk pengembang VB.NET:

Tambahkan baris berikut ke file Glabal.asax.vb, di akhir metode Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Ubah ApplicationDbContext ke konteks Db spesifik Anda.


2

Saya punya masalah ini dan ternyata satu proyek menunjuk ke SQLExpress tetapi yang bermasalah menunjuk ke LocalDb. (di web.config masing-masing). Pengawasan konyol tapi patut dicatat di sini kalau-kalau ada orang lain yang memecahkan masalah ini.


2

Ini berarti ada beberapa perubahan pada konteks yang belum dieksekusi. Silakan jalankan Add-Migration terlebih dahulu untuk menghasilkan perubahan yang telah kami lakukan (perubahan yang mungkin tidak kami sadari) Dan kemudian jalankan Update-Database


2

Saya memiliki masalah yang sama - menambahkan kembali migrasi dan memperbarui database tidak berfungsi dan tidak ada jawaban di atas yang tampaknya benar. Kemudian inspirasi menghantam saya - saya menggunakan beberapa tingkatan (satu web, satu data, dan satu bisnis). Lapisan data memiliki konteks dan semua model. Lapisan web tidak pernah melemparkan pengecualian ini - itu adalah lapisan bisnis (yang saya tetapkan sebagai aplikasi konsol untuk pengujian dan debugging). Ternyata lapisan bisnis tidak menggunakan string koneksi yang tepat untuk mendapatkan db dan membuat konteks. Jadi saya menambahkan string koneksi ke konfigurasi aplikasi dari lapisan bisnis (dan lapisan data) dan biola berfungsi. Menempatkan ini di sini untuk orang lain yang mungkin mengalami masalah yang sama.


1

Saya menggunakan metode Database.CompatibleWithModel (tersedia di EF5) untuk menguji apakah model dan DB cocok sebelum saya menggunakannya. Saya menyebut metode ini setelah membuat konteks ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }

1

Saran yang bagus, bagaimanapun, tidak begitu akurat dalam semua kasus. Saya mencari tahu. Harap Anda harus memastikan Anda menjalankan "enable-migrasi" menggunakan jendela PM di Visual Studio, dan folder Migrasi akan ditambahkan ke proyek Anda.

Pastikan dua file kelas # yang ditambahkan ke folder aktif akan berisi semua model Anda dan properti masing-masing.

Jika Anda memiliki semua yang membangun solusi, dan publis untuk ditempatkan.

Logikanya adalah bahwa metadata yang ada tidak dapat ditimpa karena aplikasi Anda tidak memiliki metadata untuk menggantikan yang sekarang. Akibatnya Anda mendapatkan kesalahan ini "Model yang mendukung konteks telah berubah sejak database dibuat"


1

Untuk berjaga-jaga jika seseorang memiliki skenario yang sama dengan saya.

Saya memiliki basis data EF pertama dan pada saat yang sama menggunakan identitas asp.net

jadi saya punya dua koneksi Connection di webconfig saya, dan tidak ada masalah dengan itu. Kebetulan saya membuat / menjalankan skrip untuk menghasilkan tabel identitas asp.net secara manual yang seharusnya tidak saya lakukan.

jadi DROP dulu semua tabel identitas asp.net yang dibuat oleh Anda secara manual / dari skrip.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers

1

Tak satu pun dari solusi ini akan bekerja untuk kita (selain menonaktifkan skema memeriksa semuanya). Pada akhirnya kami mengalami kecocokan dalam versi Newtonsoft.json kami

AppConfig kami tidak diperbarui dengan benar:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

Solusinya adalah memperbaiki versi perakitan ke versi yang sebenarnya kami gunakan

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>

Kami memiliki masalah serupa dengan versi Newtonsoft.json, ketika kami memperbarui versi masalahnya diselesaikan.
Rui Estreito

0

Setelah beberapa penelitian tentang topik ini, saya menemukan bahwa kesalahan terjadi pada dasarnya jika Anda memiliki instance db yang dibuat sebelumnya pada sql server express lokal Anda. Jadi, setiap kali Anda memiliki pembaruan pada db dan mencoba memperbarui db / jalankan beberapa kode pada db tanpa menjalankan Update Databaseperintah menggunakan Package Manager Console; pertama-tama, Anda harus menghapus db sebelumnya pada sql express lokal kami secara manual.

Juga, solusi ini berfungsi kecuali jika Anda memiliki AutomaticMigrationsEnabled = false;dalam Konfigurasi Anda.

Jika Anda bekerja dengan sistem kontrol versi (git, svn, dll.) Dan beberapa pengembang lain memperbarui objek db dalam fase produksi maka kesalahan ini meningkat setiap kali Anda memperbarui basis kode Anda dan menjalankan aplikasi.

Seperti yang dinyatakan di atas, ada beberapa solusi untuk ini pada basis kode. Namun, ini adalah yang paling praktis untuk beberapa kasus.


0

Saya membaca buku Pro ASP.NET MVC 4 juga, dan mengalami masalah yang sama yang Anda alami. Bagi saya, saya mulai mengalami masalah setelah melakukan perubahan yang ditentukan di bagian 'Menambahkan Model Validasi' buku ini. Cara saya mengatasi masalah adalah dengan memindahkan database saya dari localdb ke server SQL Server 2012 yang lengkap. (BTW, saya tahu bahwa saya beruntung saya bisa beralih ke versi full-blown, jadi jangan membenci saya. ;-))) Pasti ada sesuatu dengan komunikasi ke db yang menyebabkan masalah.


Bagaimana Anda tahu itu komunikasi ke db, dan bukan misalnya metadata-nya?
flup

2
Maaf atas tanggapan yang terlambat. Ternyata ini bukan masalah komunikasi sama sekali! Rekreasi db hanya menutupi masalah, karena saya mendapat masalah yang sama lagi! __Migrationxxx (tidak dapat mengingat nama tabel karena saya baru saja menghapusnya) dibuat oleh ef. Hapus saja dan Anda akan baik-baik saja.
J3Speaks

@ MyJ3 Semua orang menyemburkan semua baris dan baris kode friggin ini. Ini yang saya butuhkan! Layak menjadi jawaban (Skenario Opsional).
Terrance00

@ Terrance00 Terima kasih!
J3Speaks

0

Periksa langkah-langkah berikut ini

  1. Database.SetInitializer (null); -> di Global.asax.cs

2.

  1. nama kelas Konteks Anda harus cocok dengan memeriksanya

0

Ubah Global.asax.cs, termasuk Application_Startacara dengan:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());

5
Saya akan sedikit lebih jelas tentang apa yang dilakukannya, secara pribadi.
Casey

3
TIDAK, TIDAK, saya tidak ingin menggunakan DropCreateDatabaseIfModelChanges 99% dari waktu!
Tom Stickel

0

Kesalahan ini dapat menunjukkan masalah dengan string koneksi Anda dan apakah nama string koneksi Anda cocok dengan deklarasi konteks Database.

Saya mengalami kesalahan ini karena saya salah menamai basis data lokal (kesalahan konyol) dan nama string koneksi di web.config dari "DefaultConnection" tidak cocok dengan MyDbContext yaitu

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>

0

Coba gunakan Database SetInitializer yang termasuk menggunakan System.Data.Entity;

Di Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Ini akan membuat basis data baru setiap kali model Anda diubah. Tetapi basis data Anda akan kosong. Untuk mengisinya dengan data dummy, Anda dapat menggunakan Seeding. Yang dapat Anda terapkan sebagai:

Seeding ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}

0

Aneh, tetapi semua jawaban di sini tidak berguna bagi saya. Bagi saya inisialisasi bekerja

MigrasikanDatabaseToLatestVersion

Inilah solusi saya (saya tahu, ini bisa jauh lebih sederhana, tetapi beginilah cara saya menggunakannya):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting baru saja mewarisi dari DropCreateDatabaseAlways sehingga dalam beberapa kasus tertentu (pengujian), seluruh database dibangun kembali. Kalau tidak, ini akan dipindahkan ke versi terbaru.

Sumber saya: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific


0

Saya memiliki masalah yang sama ketika kami menggunakan satu database untuk dua aplikasi. Pengaturan disableDatabaseInitialization="true"di bagian tipe konteks berfungsi untuk saya.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Lihat rincian lebih lanjut https://msdn.microsoft.com/en-us/data/jj556606.aspx


0

Buat penginisialisasi konteks khusus:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

Perhatikan bahwa Migrations.Configuration adalah kelas yang dihasilkan oleh baris perintah migrasi di Package Manager Console. Anda mungkin perlu mengubah pengubah internal ke publik dari kelas Migrations.Configuration.

Dan daftarkan dari OmModelCreating Anda:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}

-1

Di sini saya ingin berbagi metode lain yang mencegah kesalahan model dukungan ketika konteks berubah adalah:

1) Buka File DbContext Anda

2) Tambahkan namespace menggunakan Microsoft.AspNet.Identity.EntityFramework;

3) publik MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (DropCreateDatabaseAlways ()) baru; }

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.