Komunikat o błędzie:
„Model będący podstawą kontekstu„ Książka adresowa ”zmienił się od czasu utworzenia bazy danych. Albo ręcznie usuń / zaktualizuj bazę danych, albo zadzwoń do Database.SetInitializer z instancją IDatabaseInitializer. Na przykład strategia RecreateDatabaseIfModelChanges automatycznie usunie i ponownie utworzy bazę danych, a także opcjonalnie zapisz go nowymi danymi ”.
Próbuję użyć funkcji pierwszego kodu, a oto co napisałem:
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());
}
Klasa kontekstu:
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 ciąg połączenia:
<?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>
Tak więc nazwa bazy danych to „Książka adresowa”, a błąd występuje, gdy próbuję dodać obiekt kontaktu do kontekstu. Czy coś tu brakuje?
.net
entity-framework-4
code-first
Ashish Gupta
źródło
źródło
Odpowiedzi:
Teraz jest:
w pliku YourDbContext.cs.
źródło
Oto kilka informacji z blogu Scotta Gu opublikowanych przez Jeffa na temat tego, co się faktycznie dzieje:
źródło
Invalid object name 'dbo.Table
sprawdzanie ciągu połączenia attachDbFilename i katalog początkowyDla Entity Framework 5.0.0.0 - 6.1.3
Ty no rzeczywiście chcemy wykonać następujące czynności:
Tak, Matt Frear ma rację. AKTUALIZACJA -EDYCJA: Zastrzegam , że zgadzam się z innymi, zamiast dodawać ten kod do global.asax dodanego do klasy DbContext
Jak wspomnieli inni, jest to również przydatne do przeprowadzania testów jednostkowych.
Obecnie używam tego z Entity Framework 6.1.3 /.net 4.6.1
Wrócę, aby udostępnić fragment CORE w najbliższej przyszłości.
źródło
Wystarczy uruchomić następujące polecenie sql w SQL Server Management Studio:
źródło
Ta poprawka nie działa już po CTP5.
Musisz zrobić
Database.SetInitializer<YourContext>(null);
źródło
Właśnie znalazłem odpowiedź i pomyślałem o aktualizacji tutaj. Wystarczy wykonać następujące czynności.
źródło
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
nie pomaga w tej sytuacji. DbDatabase.SetInitialzer (null); działa.Lub możesz umieścić tę linię w pliku Global.asax.cs w Application_Start ():
Pamiętaj, aby zmienić ProjectName.Path.Context do przestrzeni nazw i kontekstu. Jeśli najpierw użyjesz kodu, spowoduje to usunięcie i utworzenie nowej bazy danych za każdym razem, gdy zostaną wprowadzone zmiany w schemacie.
źródło
Spędziłem wiele dni, aby rozwiązać ten problem, przeanalizowałem wiele różnych postów, wypróbowałem wiele opcji i ostatecznie naprawiłem. Te dwa projekty w moim rozwiązaniu przy użyciu pierwszych migracji kodu EF:
Wystąpił ten błąd na żądanie WebApi ...
Moje środowisko:
Tutaj zebrałem wszystkie uwagi, na które należy zwrócić uwagę oraz wszystkie warunki / wymagania, które należy spełnić, aby uniknąć wspomnianego wyjątku:
Nazwa ciągu połączenia, np. MyConnectionString w pliku konfiguracyjnym projektu startowego (Web.config / App.config):
powinien być równy parametrowi przekazanemu w konstruktorze DbContext:
I główny, który naprawił mój problem: to dziwne, ale w moim folderze WebApi / bin DataModel.exe był stary, nie odświeżany od ostatniej kompilacji. Ponieważ migracje zostały osadzone w moim zestawie DataModel.exe, moja baza danych WebApi zaktualizowała bazę danych za pomocą starych mirgacji. Byłem zdezorientowany, dlaczego po aktualizacji bazy danych w WebApi nie odpowiada to najnowszemu skryptowi migracji z DataModel. Poniższy kod automatycznie tworzy (jeśli nie istnieje) lub aktualizuje najnowszą lokalną bazę danych migracji w moim folderze WebApi / App_Data.
Próbowałem wyczyścić i przebudować rozwiązanie, ale to nie pomogło, ponieważ całkowicie usunąłem foldery bin i obj z WebApi, usunąłem pliki bazy danych z WebApi / App_Data, zbudowałem, zrestartowałem WebApi, wysłałem zapytanie, utworzyłem poprawną bazę danych - leniwa inicjalizacja (przy użyciu linii powyżej), co odpowiada najnowszej migracji, a wyjątek nie pojawiał się więcej. Może to rozwiązać problem:
źródło
Dla mnie, dzięki aktualizacji do 4.3.1, po prostu obcinam tabelę EdmMetaData lub po prostu ją usuwam.
źródło
Dla programistów VB.NET:
Dodaj następujący wiersz do pliku Glabal.asax.vb na końcu metody Application_Start ()
Zmień ApplicationDbContext na określony kontekst Db.
źródło
Miałem ten problem i okazało się, że jeden projekt wskazywał na SQLExpress, ale ten z problemem wskazywał na LocalDb. (w odpowiednim pliku web.config). Głupi nadzór, ale warto tutaj zauważyć, na wypadek, gdyby ktoś rozwiązał ten problem.
źródło
Oznacza to, że były pewne zmiany w kontekście, które nie zostały wykonane. Najpierw uruchom Add-Migration, aby wygenerować zmiany, które wprowadziliśmy (zmiany, których możemy nie znać), a następnie uruchom Update-Database
źródło
Miałem ten sam problem - ponowne dodanie migracji i aktualizacja bazy danych nie działało i żadna z powyższych odpowiedzi nie wydawała się prawidłowa. Wówczas uderzyły mnie inspiracje - używam wielu warstw (jednej sieci, jednej danych i jednej firmy). Warstwa danych ma kontekst i wszystkie modele. Warstwa internetowa nigdy nie zgłosiła tego wyjątku - była to warstwa biznesowa (którą ustawiłem jako aplikację konsolową do testowania i debugowania). Okazuje się, że warstwa biznesowa nie używała prawidłowego ciągu połączenia, aby uzyskać bazę danych i utworzyć kontekst. Dodałem więc ciąg połączenia do konfiguracji aplikacji warstwy biznesowej (i warstwy danych) i viola to działa. Umieszczam to tutaj dla innych osób, które mogą napotkać ten sam problem.
źródło
Korzystam z metody Database.CompatibleWithModel (dostępnej w EF5), aby sprawdzić, czy model i DB są zgodne przed użyciem. Nazywam tę metodę zaraz po utworzeniu kontekstu ...
źródło
Dobra sugestia nie jest jednak tak dokładna we wszystkich przypadkach. Rozgaduję jeden. Upewnij się, że uruchamiasz „enable-migrations” przy użyciu okien PM w Visual Studio, a folder migracji zostanie dodany do twojego projektu.
Upewnij się, że dwa pliki klasy c # dodane do folderu będą zawierać wszystkie twoje modele i ich odpowiednie właściwości.
Jeśli masz wszystko, co tworzy rozwiązanie i publikuje do wdrożenia.
Logika jest taka, że istniejących metadanych nie można zastąpić, ponieważ aplikacja nie ma metadanych, które mogłyby zastąpić bieżące. W rezultacie pojawia się błąd „Model kopii zapasowej kontekstu zmienił się od czasu utworzenia bazy danych”
źródło
Na wypadek, gdyby ktoś miał taki sam scenariusz jak mój.
Mam bazę danych najpierw EF i jednocześnie używam tożsamości asp.net
więc mam dwa parametry ConnectionStrings w moim webconfig i nie ma z tym problemu. Zdarzyło się, że utworzyłem / uruchomiłem skrypty do ręcznego generowania tabel tożsamości asp.net, których nie powinienem.
więc DROP najpierw wszystkie tabele tożsamości asp.net utworzone przez ciebie ręcznie / ze skryptów.
źródło
Żadne z tych rozwiązań nie działałoby dla nas (oprócz całkowitego wyłączenia sprawdzania schematu). W końcu mieliśmy niedopasowanie w naszej wersji Newtonsoft.json
Nasza AppConfig nie została poprawnie zaktualizowana:
Rozwiązaniem było poprawienie wersji zestawu do tej, którą faktycznie wdrażaliśmy
źródło
Po kilku badaniach na ten temat, stwierdziłem, że błąd występuje zasadniczo, jeśli masz instancję db utworzoną wcześniej na lokalnym serwerze SQL Express. Więc ilekroć masz aktualizacje na db i spróbuj zaktualizować db / uruchom jakiś kod na db bez uruchamiania
Update Database
polecenia za pomocąPackage Manager Console
; po pierwsze, musisz ręcznie usunąć poprzednią bazę danych w naszym lokalnym ekspresowym sql express.Ponadto to rozwiązanie działa, chyba że masz
AutomaticMigrationsEnabled = false;
w konfiguracji.Jeśli pracujesz z systemem kontroli wersji (git, svn itp.), A niektórzy inni programiści aktualizują obiekty db w fazie produkcyjnej, ten błąd pojawia się za każdym razem, gdy aktualizujesz bazę kodu i uruchamiasz aplikację.
Jak wspomniano powyżej, istnieją pewne rozwiązania tego na podstawie kodu. Jest to jednak najbardziej praktyczny w niektórych przypadkach.
źródło
Czytam również książkę Pro ASP.NET MVC 4 i napotkałem ten sam problem, który miałeś. Dla mnie problem zacząłem po wprowadzeniu zmian zalecanych w rozdziale „Dodawanie walidacji modelu”. Rozwiązałem problem poprzez przeniesienie mojej bazy danych z localdb na pełnoprawny serwer SQL Server 2012. (BTW, wiem, że mam szczęście, że mogłem przejść do pełnej wersji, więc nie nienawidź mnie ;-))) Musi być coś z komunikacją z db, która powoduje problem.
źródło
Sprawdź następujące kroki
2)
źródło
Zmodyfikuj
Global.asax.cs
, w tymApplication_Start
wydarzenie za pomocą:źródło
Ten błąd może wskazywać na problem z łańcuchem połączenia i czy nazwa łańcucha połączenia jest zgodna z deklaracją kontekstu bazy danych.
Miałem ten błąd, ponieważ nazwałem lokalną bazę danych niepoprawnie (głupi błąd), a nazwa ciągu połączenia w pliku web.config „DefaultConnection” nie zgadzała się z MyDbContext, tj.
źródło
Spróbuj użyć bazy danych SetInitializer, która należy do przy użyciu System.Data.Entity;
W Global.asax
Spowoduje to utworzenie nowej bazy danych przy każdej zmianie modelu, ale baza danych byłaby pusta. Aby wypełnić ją atrapami danych, możesz użyć Seeding. Które możesz wdrożyć jako:
Siew ::
źródło
To dziwne, ale wszystkie odpowiedzi tutaj były dla mnie bezużyteczne. Dla mnie działał inicjalizator
MigrateDatabaseToLatestVersion
Oto moje rozwiązanie (wiem, może być o wiele prostsze, ale tak to wykorzystuję):
MyDbInitializerForTesting dziedziczy po DropCreateDatabaseAlways, więc w niektórych przypadkach (testowanie) cała baza danych jest odbudowywana. W przeciwnym razie jest migrowany do najnowszej wersji.
Moje źródło: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific
źródło
Miałem ten sam problem, gdy korzystaliśmy z jednej bazy danych dla dwóch aplikacji. Ustawienie
disableDatabaseInitialization="true"
w sekcji typu kontekstu działa dla mnie.Zobacz więcej szczegółów https://msdn.microsoft.com/en-us/data/jj556606.aspx
źródło
Utwórz niestandardowy inicjator kontekstu:
Zauważ, że Migrations.Configuration to klasa generująca za pomocą wiersza polecenia migracji w konsoli Menedżera pakietów. Być może trzeba będzie zmienić wewnętrzny na publiczny modyfikator klasy Migrations.Configuration.
I zarejestruj go ze swojego OmModelCreating:
źródło
Tutaj chcę udostępnić inną metodę, która zapobiega błędowi tworzenia kopii zapasowej modelu przy zmianie kontekstu:
1) Otwórz plik DbContext
2) Dodaj przestrzeń nazw za pomocą Microsoft.AspNet.Identity.EntityFramework;
3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }
źródło