Modelul care susține context s-a schimbat de la crearea bazei de date (Programare, .Net, Cadru Entitate 4, Cod Mai Întâi)

Ashish Gupta a intrebat.

Mesajul de eroare :

„Modelul care susține contextul ‘AddressBook’ s-a schimbat de când a fost creată baza de date. Fie ștergeți/actualizați manual baza de date, fie apelați Database.SetInitializer cu o instanță IDatabaseInitializer. De exemplu, strategia RecreateDatabaseIfModelChanges va șterge și va recrea automat baza de date și, opțional, o va alimenta cu date noi.”

Încerc să folosesc caracteristica „code-first” și am scris ceea ce urmează:

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());
}

Clasa context:

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

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

și șirul de conexiune:

<?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>

Deci, numele bazei de date este „AddressBook”, iar eroarea apare atunci când încerc să adaug obiectul contact în context. Îmi scapă ceva aici?

Comentarii

  • posibil duplicat al erorii Entity Framework Code Only: modelul care susține contextul s-a modificat de la crearea bazei de date –  > Por Gustav Bertram.
  • Eliminați tabelul __MigrationHistory din baza de date –  > Por Zahid Hasan.
  • @ZahidHasan Categoric, nu eliminați tabelul __MigrationsHistory decât dacă înțelegeți pe deplin scopul lui __MigrationsHistory și sunteți dispus să reconciliați manual diferența dintre cod și baza de date și să faceți aceleași modificări în producție. –  > Por Aaron Queenan.
27 răspunsuri
Matt Frear

Acum este:

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

în fișierul YourDbContext.cs.

Comentarii

  • Am schimbat manual db-ul de producție și am dezactivat migrarea și funcționează, Mulțumesc –  > Por Mohsen Afshin.
  • Ps, acest lucru merge în Global.asax Application_Start() –  > Por BritishDeveloper.
  • 49

  • Mai bine decât Global.asax este să puneți acest lucru în constructorul clasei DbContext. În acest fel, funcționează pentru fiecare site care utilizează contextul, mai degrabă decât doar pentru un singur site controlat de fișierul Global.asax. –  > Por Corin.
  • Probabil că cel mai bine este să îl puneți în constructorul static al clasei contextului, astfel încât să fie apelat doar o singură dată – ca în acest exemplu video: msdn.microsoft.com/en-us/data/jj572367 –  > Por Christian Fredh.
  • Ar trebui să fie plasat în interiorul protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer<YourDbContext>(null); base.OnModelCreating(modelBuilder); } –  > Por Chris Voon.
Randy

Iată câteva informații de la Blogul lui Scott Gu postat de Jeff cu privire la ceea ce se întâmplă de fapt:

Pentru cei care văd această excepție:

„Modelul care susține contextul „Producție” s-a schimbat de când a fost creată baza de date. Fie ștergeți/actualizați manual baza de date, fie apelați Database.SetInitializer cu un IDatabaseInitializer instanță.”

Iată ce se întâmplă și ce trebuie făcut în acest sens:

Atunci când un model este creat pentru prima dată, executăm un DatabaseInitializer pentru a face lucruri precum crearea bazei de date dacă nu există sau adăugarea de date de pornire. DatabaseInitializer-ul implicit încearcă să compare schema bazei de date necesară pentru a utiliza modelul cu un hash al schemei stocate într-un tabel EdmMetadata care este creat cu o bază de date (atunci când Code First este cel care creează baza de date). Bazele de date existente nu vor avea tabelul EdmMetadata și, prin urmare, nu vor avea hash-ul… iar implementarea de astăzi va da eroare dacă acel tabel lipsește. Vom lucra la schimbarea acestui comportament înainte de a livra versiunea finală, deoarece este implicit. Până atunci, bazele de date existente nu au nevoie, în general, de niciun inițializator de bază de date, astfel încât acesta poate fi dezactivat pentru tipul de context prin apelarea:

Database.SetInitializer<YourDbContext>(null);

Jeff

Comentarii

  • Am încercat acest lucru astăzi și nu mai primesc „Modelul s-a schimbat”, în schimb primesc „Nume de obiect invalid ‘dbo.Table'” –  > Por Stefan Bergfeldt.
  • Jeff a vrut ca aceasta să fie o soluție de rezolvare, dar au trecut mai mult de doi ani de atunci și SetInitializer to null este încă necesar. corect? Deci, ar putea cineva să explice cum se potrivește acest lucru în fluxul de lucru al migrării. –  > Por kroiz.
  • @jakejgordon: Și eu cu EF6, dar dacă este în Global.asax, rezolvă problema doar atunci când rulează site-ul web. Dacă aveți teste unitare, sunteți OOL. Mai bine puneți-o în constructorul lui YourDbContext. Asta o rezolvă pentru fiecare proiect, inclusiv pentru site-ul web și proiectele de testare. –  > Por Rap.
  • IMO, acest răspuns ar trebui să primească un punctaj mai mare, deoarece explică de fapt de ce trebuie să adăugăm această linie de cod. Vă mulțumim. –  > Por Paul.
  • @StefanBergfeldt dacă tu sau altcineva obțineți Invalid object name 'dbo.Table verificați șirul de conexiune attachDbFilename și catalogul inițial –  > Por benscabbia.
Tom Stickel

Pentru Entity Framework 5.0.0.0.0 – 6.1.3

Tu DO într-adevăr doriți să faceți următoarele:

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

Da, Matt Frear are dreptate. UPDATE -EDIT: Caveat este că sunt de acord cu ceilalți că, în loc să adăugați acest cod la global.asax adăugat la clasa DbContext dvs.

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

După cum au menționat și alții, acest lucru este bun și pentru gestionarea testării unitare.

În prezent, folosesc acest lucru cu Entity Framework 6.1.3 /.net 4.6.1.

Voi reveni pentru a oferi un fragment CORE în viitorul apropiat.

Comentarii

  • Vă mulțumesc! Program.cs funcționează cu siguranță pentru console. –  > Por HockeyJ.
  • Dar atunci când inițializați prima dată baza de date, atunci nu se creează baza de date dacă pun setinitializer null la metoda onModelCreating. Vreo idee? Chiar dacă folosesc (var context = Activator.CreateInstance<TContext>())) { context.Database.Initialize(true); } –  > Por Rupesh Kumar Tiwari.
  • Am nevoie să găsesc codul meu pe care l-aș folosi că uneori aș comenta o linie și aș schimba … Nu-mi amintesc la îndemână problema, trebuie să mă uit. –  > Por Tom Stickel.
  • Cea mai bună soluție. Aceasta face ca soluția mea să funcționeze și nu am idee care sunt ramificațiile. Commit and deploy. –  > Por Svend.
Shafqat Ali

Doar rulați următoarea comandă sql în SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]

Comentarii

  • Mi-ați salvat viața! Vă mulțumesc. –  > Por Marek Dorda.
  • Nu eliminați tabelul __MigrationsHistory decât dacă înțelegeți pe deplin scopul lui __MigrationsHistory și sunteți dispus să reconciliați manual diferența dintre cod și baza de date și să faceți aceleași modificări în producție. –  > Por Aaron Queenan.
chrisortman

Această remediere nu mai funcționează după CTP5.

Trebuie să faceți Database.SetInitializer<YourContext>(null);

Comentarii

  • Unde se duce asta… OnModelCreating nu are nimic accesibil numit DbDatabase –  > Por James Reategui.
  • Undeva la pornire, eu l-am setat pe al meu în Application_Start. –  > Por chrisortman.
  • Database.SetInitializer pare să funcționeze bine în versiunea finală EF 4.3. –  > Por Richard Beier.
  • Presupun că „Această soluție nu mai funcționează după CTP5” înseamnă că răspunsul acceptat din 30 august 2010 este ceea ce spune el. –  > Por Tom Stickel.
Ashish Gupta

Tocmai am aflat răspunsul și m-am gândit să actualizez aici. Trebuie doar să faceți următoarele.

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

Comentarii

  • Acest lucru nu mai este posibil cu versiunile ulterioare ale EF, de asemenea modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); nu ajută la rezolvarea situației. DbDatabase.SetInitialzer(null); funcționează. –  > Por JTew.
  • @TomStickel – Sunt de acord. Am marcat stackoverflow.com/a/6143116/255562 ca fiind răspunsul. –  > Por Ashish Gupta.
dwp4ge

Sau puteți pune această linie în fișierul Global.asax.cs în fișierul Global.asax.cs sub Application_Start():

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

Asigurați-vă că schimbați ProjectName.Path.Context cu spațiul de nume și contextul dvs. Dacă utilizați mai întâi codul, acest lucru va șterge și va crea o nouă bază de date ori de câte ori se fac modificări în schemă.

Comentarii

  • Exact ceea ce aveam nevoie, deoarece făceam doar prototipuri. Mulțumesc mult. –  > Por Cursant.
Sergey Kulgan

Am petrecut multe zile pentru a rezolva această problemă, am analizat multe posturi diferite și am încercat multe opțiuni și în cele din urmă am rezolvat. Acest 2 proiecte în soluția mea folosind codul EF primele migrații:

  • Aplicația de consolă „DataModel” care utilizează în principal ca ansamblu care conține toate entitățile mele de cod first, DbContext, Mirgations și depozitul generic. Am inclus în acest proiect un fișier de bază de date local gol separat (în dosarul DataModel/App_Data) pentru a putea genera migrări din consola Package Manager.
  • WebApi, care face referire la proiectul DataModel și utilizează fișierul local de baze de date din dosarul WebApi/App_Data, care nu este inclus în proiect.

Am primit această eroare când am solicitat WebApi…

Mediul meu:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional cu actualizarea 1
  • toate proiectele mele vizează .NET Framework 4.6.1
  • EntityFramework 6.1.3 din NuGet

Aici am adunat toate observațiile la care trebuie să fiți atenți și toate condițiile/cerințele care trebuie îndeplinite, pentru a evita excepția menționată :

  1. Trebuie să utilizați o singură versiune a pachetului Nuget EntityFramework pentru toate proiectele din soluția dumneavoastră.
  2. Baza de date, creată prin rularea secvențială a tuturor scripturilor de migrare, trebuie să aibă aceeași structură/schemă ca și baza de date țintă și să corespundă modelului de entități. Următoarele 3 lucruri trebuie să corespundă/reflecteze/se potrivească exact între ele:
    • toate scripturile de migrare până la ultimul
    • codul curent prima stare a modelului de entitate (DbContext, entități)
    • Baza de date țintă
  3. Baza de date țintă (fișier mdf) trebuie să fie actualizată/corespunzătoare până la ultimul script de migrare. Verificați dacă tabelul „__MigrationHistory” din baza de date țintă conține înregistrări pentru toate scripturile de migrare pe care le aveți, ceea ce înseamnă că toate scripturile de migrare au fost aplicate cu succes în baza de date respectivă. Vă recomand să utilizați Visual Studio pentru generarea corectă a entităților Code First și a contextului care corespunde bazei de date, Project -> Add New Item -> ADO.NET Entity Data Model -> Code First din baza de date: Desigur, ca o alternativă, dacă nu aveți o bază de date puteți scrie manual modelul (code first entities și context) și apoi generați migrația inițială și baza de date.
  4. Numele șirului de conexiune, de ex. MyConnectionString în fișierul de configurare al proiectului de pornire (Web.config/App.config):

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

    ar trebui să fie egal cu parametrul transmis în constructorul DbContext-ului dumneavoastră:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Înainte de a utiliza Package Manager Console, asigurați-vă că utilizați baza de date corectă pentru actualizare sau generare de migrare și că proiectul necesar este setat ca fiind proiectul de pornire al soluției. Pentru conectarea la baza de date se va folosi șirul de conexiune din acel fișier .config, care în proiect este setat ca proiect de pornire.
  6. Și principalul, care mi-a rezolvat problema: Este ciudat, dar în dosarul meu WebApi/bin DataModel.exe era vechi, nu a fost actualizat de la ultima editare. Din moment ce migrațiile au fost încorporate în ansamblul meu DataModel.exe, atunci WebApi-ul meu a actualizat baza de date folosind vechiul mirgations. Am fost confuz de ce, după actualizarea bazei de date în WebApi, aceasta nu corespunde celui mai recent script de migrare din DataModel. Următorul cod creează automat (dacă nu există) sau actualizează la cea mai recentă bază de date locală de migrare în dosarul WebApi/App_Data.

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

    Am încercat o soluție de curățare și reconstrucție, dar nu a fost de ajutor, apoi am eliminat complet dosarelebin și obj din WebApi, am șters fișierele bazei de date din WebApi/App_Data, am construit, am repornit WebApi, am făcut o cerere către acesta, a creat baza de date corectă – inițializare leneșă (folosind liniile de mai sus), care corespunde celei mai recente migrări și nu a mai apărut nicio excepție.Deci, acest lucru poate rezolva problema dvs:

    1. eliminați manual dosarele bin, obj din proiectul de pornire. (care generează/actualizează baza de date)
    2. construiți proiectul de pornire sau, mai bine, curățați și reconstruiți toată soluția dvs.
    3. recreați baza de date prin pornirea proiectului (se vor executa liniile de mai sus) sau utilizați comanda „update-database” din consola Package Manager.
    4. verificați manual dacă baza de date generată și __MirgationHistory corespund ultimului script de migrare.

Robert Koch

În cazul meu, odată cu actualizarea la 4.3.1, am trunchiat tabelul EdmMetaData sau pur și simplu l-am șters pur și simplu.

Comentarii

  • Am actualizat la 4.3.1 și apoi am redenumit doar tabelul EdmMaetaData. Acum pot face modificări la model după cum este necesar și nu mai am mesaje de eroare enervante despre modelul care susține bla bla bla. –  > Por Ashok Padmanabhan.
Eric Schneider

Pentru dezvoltatorii VB.NET:

Adăugați următoarea linie în fișierul Glabal.asax.vb, la sfârșitul metodei Application_Start()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Schimbați ApplicationDbContext cu contextul Db specific.

stuartdotnet

Am avut această problemă și s-a dovedit că un proiect indica SQLExpress, dar cel cu probleme indica LocalDb. (în web.config-ul lor respectiv). O scăpare prostească, dar merită notată aici în cazul în care altcineva rezolvă această problemă.

Kerisnarendra

Înseamnă că au existat unele modificări în context care nu au fost executate. vă rugăm să rulați mai întâi Add-Migration pentru a genera modificările pe care le-am făcut (modificările pe care s-ar putea să nu le cunoaștem)Și apoi rulați Update-Database

Richard Barker

Am avut aceeași problemă – readucerea migrației și actualizarea bazei de date nu a funcționat și niciunul dintre răspunsurile de mai sus nu mi s-a părut corect. Apoi m-a lovit inspirația – folosesc mai multe niveluri (unul web, unul de date și unul de afaceri). Nivelul de date are contextul și toate modelele. Stratul web nu a aruncat niciodată această excepție – a fost stratul de afaceri (pe care l-am setat ca aplicație de consolă pentru testare și depanare). Se pare că stratul de afaceri nu folosea șirul de conexiune corect pentru a obține baza de date și a crea contextul. Așa că am adăugat șirul de conexiune la configurarea aplicației stratului de afaceri (și a stratului de date) și viola funcționează. Punând acest lucru aici pentru alții care ar putea întâmpina aceeași problemă.

flobadob

Eu folosesc metoda Database.CompatibleWithModel (disponibilă în EF5) pentru a testa dacă modelul și BD se potrivesc înainte de a le folosi. Chem această metodă imediat după ce am creat contextul…

        // 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

        }

DanAbdn

Această eroare poate indica o problemă cu șirul de conexiuni și dacă numele șirului de conexiuni se potrivește cu declarația contextului Bazei de date.

Am avut această eroare deoarece am numit greșit baza de date locală (greșeală prostească) și numele șirului de conexiune din web.config de „DefaultConnection” nu se potrivea cu MyDbContext, adică

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


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

Comentarii

  • Acesta ar trebui să fie răspunsul acceptat!!! Răspunsul tuturor celorlalți de aici mi-a irosit o oră din timpul meu, acesta este singurul care a eliminat mesajul de eroare fără să fie nevoie să modific nimic. –  > Por AndrewBenjamin.
Kay Ken

Bună sugestie, totuși, nu atât de precisă în toate cazurile. Mi-am dat seama de unul. vă rugăm să vă asigurați că executați „enable-migrations” folosind ferestrele PM în Visual Studio, iar folderul de migrare ar fi adăugat la proiectul dvs.

Asigurați-vă că cele două fișiere de clasă c# adăugate la dosarul pe va conține toate modelele dvs. și proprietățile lor respective.

Dacă aveți toate acestea, construiți soluția și publicați-o pentru implementare.

Logica este că metadatele existente nu pot fi suprascrise, deoarece aplicația dvs. nu are metadate care să le înlocuiască pe cele actuale. Ca urmare, primiți această eroare: „Modelul care susține contextul s-a schimbat de la crearea bazei de date”.

Francis Saul

În cazul în care cineva are același scenariu ca al meu.

Eu am baza de date EF în primul rând și în același timp folosesc identitatea asp.net

așa că am două connectionStrings în webconfig și nu este nici o problemă în acest sens. S-a întâmplat că am creat/executat scripturi pentru a genera manual tabelele asp.net identity ceea ce nu trebuia.

deci DROP mai întâi toate tabelele de identitate asp.net create de dvs. manual/din scripturi.

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

AcidPAT

Niciuna dintre aceste soluții nu ar funcționa pentru noi (în afară de dezactivarea totală a verificării schemei). În cele din urmă, am avut o neconcordanță în versiunea noastră de Newtonsoft.json

AppConfig-ul nostru nu a fost actualizat corect:

<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>

Soluția a fost de a corecta versiunea de asamblare la cea pe care o implementăm efectiv.

<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>

Comentarii

  • Am avut o problemă similară cu versiunea Newtonsoft.json, când am actualizat versiunea, problema s-a rezolvat. –  > Por Rui Estreito.
Mahmut C

După câteva cercetări pe această temă, am aflat că eroarea apare practic dacă aveți o instanță de db creată anterior pe serverul local sql express. Deci, ori de câte ori aveți actualizări pe db și încercați să actualizați db/ să rulați un cod pe db fără a rula Update Database comanda folosind Package Manager Console; în primul rând, trebuie să ștergeți manual db anterioară pe serverul nostru local sql express.

De asemenea, această soluție funcționează dacă nu aveți AutomaticMigrationsEnabled = false;în configurația dvs.

Dacă lucrați cu un sistem de control al versiunilor (git,svn,etc.) și alți dezvoltatori actualizează obiectele db în faza de producție, atunci această eroare apare ori de câte ori actualizați baza de cod și rulați aplicația.

După cum s-a menționat mai sus, există câteva soluții pentru acest lucru pe baza de cod. Cu toate acestea, aceasta este cea mai practică pentru unele cazuri.

J3Speaks

Citesc și eu cartea Pro ASP.NET MVC 4 și m-am lovit de aceeași problemă pe care o aveai și tu. În cazul meu, am început să am această problemă după ce am făcut modificările prescrise în secțiunea „Adăugarea validării modelului” din carte. Modul în care am rezolvat problema este prin mutarea bazei de date de pe localdb pe serverul SQL Server 2012 în toată regula. (BTW, știu că sunt norocos că am putut trece la versiunea full-blown, așa că nu mă urâți ;-)))) Trebuie să fie ceva cu comunicarea către db care cauzează problema.

Comentarii

  • De unde știi că este vorba de comunicarea cu baza de date și nu, de exemplu, de metadatele acesteia? –  > Por flup.
  • Îmi cer scuze pentru răspunsul întârziat. Se pare că nu este deloc o problemă de comunicare! Recrearea bazei de date doar a mascat problema, pentru că am avut din nou aceeași problemă! Un __Migrationxxx (nu-mi amintesc numele exact al tabelului pentru că tocmai l-am eliminat) este creat de ef. Pur și simplu ștergeți-o și ar trebui să fie totul în regulă. –  > Por J3Speaks.
  • @MyJ3 Toți oamenii care scuipă toate aceste linii și linii de cod nenorocite. Asta e tot ce aveam nevoie! Merită să fie un răspuns (Scenariu opțional). –  > Por Terrance00.
  • @Terrance00 Mulțumesc! –  > Por J3Speaks.
Siva

Verificați următorii pași

  1. Database.SetInitializer(null); –>in Global.asax.cs

2.

  1. numele clasei Context ar trebui să se potrivească cu verificați-l

oeddy

Modificați Global.asax.cs, inclusiv Application_Start eveniment cu:

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

Comentarii

  • Personal, aș fi un pic mai clar cu privire la ceea ce face acest lucru. –  > Por Casey.
  • NU, NU, NU, NU, nu vreau să folosesc DropCreateDatabaseIfModelChanges 99% din timp! –  > Por Tom Stickel.
SinghMavi

Încercați să utilizați Database SetInitializer care aparține de utilizarea System.Data.Entity;

În Global.asax

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

Acest lucru va crea o nouă bază de date de fiecare dată când modelul dvs. este schimbat.Dar baza de date ar fi goală.Pentru a o umple cu date fictive, puteți utiliza Seeding. Pe care o puteți implementa ca :

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);
    }

}

Tomino

Este ciudat, dar toate răspunsurile de aici au fost inutile pentru mine. Pentru mine a funcționat inițializatorul

MigrateDatabaseToLatestVersion

Iată soluția mea (știu, poate fi mult mai simplă, dar așa o folosesc eu):

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 moștenește doar din DropCreateDatabaseAlways, astfel încât, într-un anumit caz specific (testare), întreaga bază de date este reconstruită. În caz contrar, este migrat la cea mai recentă versiune.

Sursa mea: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

Julia Savinkova

Am avut aceeași problemă atunci când am folosit o bază de date pentru două aplicații. Setarea disableDatabaseInitialization="true" în secțiunea tip de context funcționează pentru mine.

<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>

Vedeți mai multe detalii https://msdn.microsoft.com/en-us/data/jj556606.aspx

Tomas Kubes

Creați un inițializator de context personalizat:

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);
        }
    }       
}

Rețineți că Migrations.Configuration este o clasă generată de linia de comandă de migrare în Consola Managerului de pachete. Este posibil să fie necesar să schimbați modificatorul internal în public al clasei Migrations.Configuration.

Și să o înregistrați din OmModelCreating:

public partial class MyDbContext : DbContext
{

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

        //other code for creating model
    }
}

Milan Goswami

Aici vreau să împărtășesc o altă metodă care previne eroarea de backing a modelului atunci când contextul s-a schimbat este:

1) Deschideți fișierul DbContext

2) Adăugați spațiul de nume folosind Microsoft.AspNet.Identity.EntityFramework;

3) public MyDbContext() : base(„name=MyDbContext”) { Database.SetInitializer(new DropCreateDatabaseAlways()); }

Comentarii

  • Acest lucru ar șterge întreaga bază de date. Poate că este în regulă pentru dezvoltare, dar atunci când acest cod va fi publicat accidental în producție și va șterge totul, nimeni nu va fi mulțumit de acest lucru. –  > Por Aaron Queenan.