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?
.net
entity-framework-4
code-first
Ashish Gupta
sumber
sumber
Jawaban:
Sekarang ini:
dalam file YourDbContext.cs Anda.
sumber
Berikut beberapa informasi dari Blog Scott Gu yang diposting oleh Jeff tentang apa yang sebenarnya terjadi:
sumber
Invalid object name 'dbo.Table
cek string koneksi Anda attachDbFilename dan katalog awalUntuk Entity Framework 5.0.0.0 - 6.1.3
Anda DO memang ingin melakukan hal berikut:
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
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.
sumber
Jalankan perintah followng sql di SQL Server Management Studio:
sumber
Perbaikan ini tidak lagi berfungsi setelah CTP5.
Kamu harus melakukan
Database.SetInitializer<YourContext>(null);
sumber
Baru saja menemukan jawaban dan pemikiran untuk memperbarui di sini. Hanya perlu melakukan hal berikut.
sumber
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
tidak membantu situasi. DbDatabase.SetInitialzer (null); tidak bekerja.Atau Anda dapat meletakkan baris ini di file Global.asax.cs Anda di bawah Application_Start ():
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.
sumber
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:
Saya mendapatkan kesalahan ini ketika diminta WebApi ...
Lingkungan saya:
Di sini saya mengumpulkan semua komentar yang harus Anda perhatikan dan semua kondisi / persyaratan yang harus dipenuhi, untuk menghindari pengecualian yang disebutkan:
Nama string koneksi mis. MyConnectionString dalam file konfigurasi proyek startup (Web.config / App.config):
harus sama dengan parameter yang diteruskan dalam konstruktor DbContext Anda:
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.
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:
sumber
Bagi saya, dengan upgrade ke 4.3.1, saya hanya memotong tabel EdmMetaData atau hanya menghapusnya saja.
sumber
Untuk pengembang VB.NET:
Tambahkan baris berikut ke file Glabal.asax.vb, di akhir metode Application_Start ()
Ubah ApplicationDbContext ke konteks Db spesifik Anda.
sumber
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.
sumber
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
sumber
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.
sumber
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 ...
sumber
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"
sumber
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.
sumber
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:
Solusinya adalah memperbaiki versi perakitan ke versi yang sebenarnya kami gunakan
sumber
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 Database
perintah menggunakanPackage 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.
sumber
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.
sumber
Periksa langkah-langkah berikut ini
2.
sumber
Ubah
Global.asax.cs
, termasukApplication_Start
acara dengan:sumber
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
sumber
Coba gunakan Database SetInitializer yang termasuk menggunakan System.Data.Entity;
Di Global.asax
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 ::
sumber
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):
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
sumber
Saya memiliki masalah yang sama ketika kami menggunakan satu database untuk dua aplikasi. Pengaturan
disableDatabaseInitialization="true"
di bagian tipe konteks berfungsi untuk saya.Lihat rincian lebih lanjut https://msdn.microsoft.com/en-us/data/jj556606.aspx
sumber
Buat penginisialisasi konteks khusus:
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:
sumber
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; }
sumber