Aktualizacja bazy danych nie powiodła się z konsoli Menedżera pakietów. Użyłem Entity Framework 6.xi podejścia Code-First. Błąd jest
„W bazie danych istnieje już obiekt o nazwie„ AboutUs ”.”
Jak mogę rozwiązać ten problem?
internal sealed class Configuration
: DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}
protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
{
}
}
Mój DbContext to:
public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
public JahanBlogDbContext()
: base("name=JahanBlogDbConnectionString")
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>().ToTable("Role");
modelBuilder.Entity<UserRole>().ToTable("UserRole");
modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
}
public virtual DbSet<Article> Articles { get; set; }
public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
public virtual DbSet<ArticleTag> ArticleTags { get; set; }
public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
public virtual DbSet<Comment> Comments { get; set; }
public virtual DbSet<CommentLike> CommentLikes { get; set; }
public virtual DbSet<CommentReply> CommentReplies { get; set; }
public virtual DbSet<ContactUs> ContactUs { get; set; }
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet<ProjectState> ProjectStates { get; set; }
public virtual DbSet<ProjectTag> ProjectTags { get; set; }
public virtual DbSet<Rating> Ratings { get; set; }
public virtual DbSet<Tag> Tags { get; set; }
public virtual DbSet<AboutUs> AboutUs { get; set; }
}
Konsola zarządzania pakietami:
PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
[Id] [int] NOT NULL IDENTITY,
[Description] [nvarchar](max),
[IsActive] [bit] NOT NULL,
[CreatedDate] [datetime],
[ModifiedDate] [datetime],
CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' in the database.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM>
database
entity-framework
ef-code-first
entity-framework-6
ef-migrations
Powiedział Roohullah Allem
źródło
źródło
Odpowiedzi:
wygląda na to, że wystąpił problem w procesie migracji, uruchom polecenie add-migration w "Konsoli menedżera pakietów":
zrób kilka zmian, a następnie zaktualizuj bazę danych z pliku "Initial":
Edycja: -IgnoreChanges znajduje się w EF6, ale nie w EF Core, oto obejście: https://stackoverflow.com/a/43687656/495455
źródło
Może zmieniłeś przestrzeń nazw w swoim projekcie!
W Twojej bazie danych znajduje się tabela o nazwie
dbo.__MigrationHistory
. Tabela zawiera kolumnę o nazwieContextKey
.Wartość tej kolumny jest oparta na Twoim
namespace
. na przykład to „DataAccess.Migrations.Configuration
”.Zmiana przestrzeni nazw powoduje powielenie nazw tabel z różnymi przestrzeniami nazw.
Tak więc po zmianie przestrzeni nazw po stronie kodu zmień również przestrzeń nazw w tej tabeli w bazie danych (dla wszystkich wierszy).
Na przykład, jeśli zmienisz przestrzeń nazw na
EFDataAccess
, to powinieneś zmienić wartościContextKey
kolumny wdbo.__MigrationHistory
na „EFDataAccess.Migrations.Configuration
”.Następnie po stronie kodu, w Tools => Package Manager Console, użyj
update-database
polecenia.Inną opcją zamiast zmiany wartości kontekstu w bazie danych jest sztywne zakodowanie wartości kontekstu w kodzie do starej wartości przestrzeni nazw. Jest to możliwe poprzez dziedziczenie
DbMigrationsConfiguration<YourDbContext>
iw konstruktorze po prostu przypisanie starej wartości kontekstu doContextKey
, a następnie dziedziczenie zMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
i pozostawienie tej klasy pustej. Ostatnią rzeczą do zrobienia jest wywołanieDatabase.SetInitializer(new YourDbInitializer());
w swoim DbContext w konstruktorze statycznym.Mam nadzieję, że Twój problem zostanie rozwiązany.
źródło
MigrationHistory
tabeli nie rozwiązało tego problemu ... więc porzuciłem wszystkie moje tabele i pozwoliłem EF stworzyć je od nowa, mała aplikacja, nic wielkiego. ... ale to naprawiło to dla mnie.Ten wyjątek oznacza, że ktoś już dodał obiekt o nazwie „AboutUs” do bazy danych.
AutomaticMigrationsEnabled = true;
może do tego doprowadzić, ponieważ wersje baz danych nie są w tym przypadku kontrolowane przez Ciebie. Aby uniknąć nieprzewidywalnych migracji i upewnić się, że każdy programista w zespole pracuje z tą samą strukturą bazy danych, którą sugeruję ustawićAutomaticMigrationsEnabled = false;
.Automatyczne migracje i migracje kodowane mogą istnieć obok siebie, jeśli jesteś bardzo ostrożny i jesteś jedynym programistą w projekcie.
Istnieje cytat z wpisu Automatyczne migracje Code First w Centrum deweloperów danych :
źródło
W moim przypadku mój
EFMigrationsHistory
stół został (jakoś) opróżniony i przy próbie uruchomieniaupdate-database
dostałem:Po zobaczeniu, że tabela została opróżniona, miało sens, że próbowała ponownie uruchomić początkową migrację i odtworzyć tabele.
Aby rozwiązać ten problem, dodałem wiersze do mojej
EFMigrationsHistory
tabeli. 1 wiersz dla każdej migracji, o której wiedziałem, że baza danych jest aktualna.Wiersz będzie miał 2 kolumny:
MigrationId
iProductVersion
MigrationId
to nazwa pliku migracji. Przykład:20170628112345_Initial
ProductVersion
to wersja ef, którą używasz. Możesz to znaleźć, wpisującGet-Package
do konsoli menedżera pakietów i szukając swojego pakietu ef.Mam nadzieję, że to jest pomocne dla kogoś.
źródło
W moim przypadku zmieniłem nazwę zestawu, który zawierał model struktury encji jako pierwszy kod. Chociaż rzeczywisty schemat nie zmienił się w żadnej tabeli migracji o nazwie
zawiera listę już wykonanych migracji na podstawie starej nazwy zestawu. Zaktualizowałem starą nazwę w tabeli migracji, aby pasowała do nowej, a migracja działała ponownie.
źródło
Upewnij się, że projekt startowy rozwiązań zawiera poprawne parametry połączenia w pliku konfiguracyjnym. Lub ustaw parametr -StartUpProjectName podczas wykonywania polecenia update-database. Parametr -StartUpProjectName określa plik konfiguracyjny, który ma być używany dla nazwanych parametrów połączenia. W przypadku pominięcia używany jest plik konfiguracji określonego projektu.
Oto łącze do odwołań do poleceń ef-migracji http://coding.abel.nu/2012/03/ef-migrations-command-reference/
źródło
Miałem ten sam problem i po trzech godzinach walki dowiaduję się, co się dzieje
W moim przypadku, gdy po raz pierwszy chciałem migrować w
up()
metodzie, domyślny kod chce utworzyć tabele, które już istniały, więc mam ten sam błąd co tyAby go rozwiązać, po prostu usuń ten kod i napisz, co chcesz. Na przykład chciałem dodać kolumnę, więc po prostu piszę
źródło
@
moją nazwę użytkownika w sekcji komentarzy.Uwaga: niezalecane rozwiązanie. ale w niektórych przypadkach szybkie rozwiązanie.
Dla mnie,
dbo._MigrationHistory
w produkcyjnej bazie danych brakowało rekordów migracji podczas procesu publikowania, ale programistyczna baza danych miała wszystkie rekordy migracji.Jeśli masz pewność, że baza produkcyjna ma ten sam i najnowszy schemat w porównaniu do bazy danych deweloperskich, skopiowanie wszystkich rekordów migracji do bazy produkcyjnej może rozwiązać problem.
Możesz zrobić tylko z VisualStudio.
dbo._MigrationHistory
tabelę w źródłowej (w moim przypadku dev db) bazie danych> kliknij menu „Porównanie danych ...”.Zwróć uwagę, że ponownie nie jest to zalecane w złożonych i poważnych projektach. Użyj tego tylko wtedy, gdy masz problem podczas uczenia się ASP.Net lub EntityFramework.
źródło
Usuń wiersze z tabeli dbo_MigrationHistory lub usuń tabelę i uruchom
Uruchomi po kolei wszystkie migracje w Twoim projekcie
źródło
W moim przypadku problem dotyczył Seedera. Wewnątrz niego wywoływałem _ctx.Database.EnsureCreated () i, o ile zrozumiałem, polecenie aktualizacji bazy danych zostało pomyślnie wykonane, ale następnie siewnik próbował utworzyć bazę danych „po raz drugi”.
Jak adresować:
źródło
Inny scenariusz EF Core w przypadku krawędzi.
Sprawdź, czy masz plik Migrations / YOURNAMEContextModelSnapshot.cs .
jak opisano szczegółowo w - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration
Jeśli próbowałeś ręcznie odtworzyć bazę danych, usuwając pliki migracji.cs, uważaj, aby plik Migrations / * ContextModelSnapshot.cs nadal istniał.
Bez tego kolejne migracje nie będą miały migawki, na której można by utworzyć wymagane różnice, a nowe pliki migracji będą wyglądać tak, jakby tworzyły wszystko od nowa, a następnie pojawi się istniejący błąd tabeli, jak powyżej.
źródło
to samo stało się ze mną. Problem polegał na tym, że faktycznie usunąłem tabelę bazy danych
MoviesCast
i utworzyłem nową tabelę, a problem polegał na tym, że moja ostatnia migracja próbowała wywołać usuniętą tabelęMoviesCast
w bazie danych. Rozwiązałem to, po prostu usuwając całą zawartość ostatniej migracji i po prostu uruchomiłem metodę Up () i down ()następnie zaktualizował bazę danych i po prostu dodaj nową migrację
źródło
Miałem ten sam problem opisany w odpowiedzi, której udzielił Elnaz. Miałem wymóg zmiany przestrzeni nazw warstwy danych podczas refaktoryzacji naszego projektu. To spowodowało, że migracje nie widziały istniejących migracji w bazie danych. Znalazłem doskonałą odpowiedź na ten problem, który opublikował James Chambers.
http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/
Po prostu zmieniłem następujące elementy w pliku konfiguracyjnym migracji.
Mam nadzieję, że to pomoże komuś innemu w trudnej sytuacji.
źródło
Po prostu wykonaj polecenie update-migracja -Script. Spowoduje to wygenerowanie nowego skryptu * .sql, który zawiera wszystkie zmiany bazy danych zawarte w migracji. Na końcu kodu są polecenia wstawiania coś takiego: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) możesz po prostu uruchomić to wszystko INSERT i DB zostanie zsynchronizowany
źródło
Po ponad godzinie bez żadnych wyników spróbowałem innego podejścia, nie używając migracji, ale zrobiłem porównanie schematu.
W programie Visual Studio -> Narzędzia -> SQL Server -> Porównanie nowego schematu
Najpierw utworzyłem zupełnie nową bazę danych z migracjami EF. Następnie porównałem, porównując nową bazę danych z tą, którą chciałem zaktualizować. W końcu wygenerowałem skrypt migracji i mogłem dokonać aktualizacji schematu.
źródło
W moim przypadku (chcę zresetować i uzyskać świeżą bazę danych),
Najpierw otrzymałem komunikat o błędzie:
There is already an object named 'TABLENAME' in the database.
i widziałem trochę wcześniej:
Moja baza danych została utworzona, ale nie ma wpisu w historii migracji.
Usuwam wszystkie tabele oprócz dbo .__ MigrationsHistory
MigrationsHistory było puste.
Biegać
dotnet ef database update -c StudyContext --verbose
(--verbose tylko dla zabawy)
i dostał
Done.
źródło
Napotkałem ten sam błąd, co poniżej. Następnie naprawiłem to jak poniżej:
dotnet ef migrations list
dotnet ef migrations remove
4. Teraz jest w porządku. Spróbuj ponownie dodać:
dotnet ef migrations add [new_dbo_name]
Na koniec spróbuj ponownie zaktualizować, zgodnie z ustaleniami na podstawie listy migracji:
dotnet ef database update [First]
dotnet ef database update [Second]
dotnet ef database update [new_dbo_name]
Mam nadzieję, że jest to pomocne dla Ciebie. ^^
źródło
Usunąłeś folder migracji niż próbujesz uruchomić polecenie „update-database” w konsoli Menedżera pakietów? w takim razie
Po prostu ręcznie usuń wszystkie swoje tabele, a następnie uruchom, jeśli aktualizacja-dataabse (dane początkowe cons zostaną usunięte)
źródło
Innym sposobem na to jest komentowanie wszystkiego w klasie początkowej, między metodami Up i Down, a następnie uruchamianie update-database, po pomyślnym uruchomieniu metody seed należy ponownie uruchomić aktualizację bazy danych. Może to być pomocne dla niektórych znajomych.
źródło
Miałem ten sam problem. Wypróbowałem poniższe rozwiązanie: 1. usunąłem kod tworzenia tabeli z metody Up () i powiązany kod z metody Down () 2. Uruchom polecenie update-database w programie Package Manager Consol
to rozwiązało mój problem
źródło
Uwaga: zrobiłem to, ponieważ nie mam nic w mojej bazie danych. W moim przypadku: 1. Usunąłem migrację za pomocą polecenia usuń-migracja w konsoli Menedżera pakietów 2. Usunięto bazę danych za pomocą panelu „Eksplorator obiektów SQL Server”> w bieżącej bazie danych> kliknij prawym przyciskiem myszy> Usuń 3. Migrowane w konsoli Menedżera pakietów napisz Dodaj -Migracja i kliknij Enter 4. Ostatnia aktualizacja komendą update-database
źródło
Ten sam przypadek (brak tabeli DB i MigrationHistory na serwerze). Moje kroki:
źródło
W bazie danych wyślij zapytanie do tabeli __MigrationHistory i skopiuj [ContextKey].
Wklej go do DbMigrationsConfiguration ConextKey, jak poniżej
źródło
Poniższe kroki zadziałały dla mnie w przypadku tego samego problemu:
Scenariusz:
Próbowałem dodać 2 nowe pola do mojego istniejącego modelu funkcji poczty e-mail. Nowe pola to „IsEmailVerified” i „ActivationCode”
Kroki, które wykonałem:
1. Usunięto stare pliki migracyjne w folderze „Migracje”, co uniemożliwiło mi aktualizację bazy danych 2. Przywróciłem wszystkie moje ostatnie zmiany, które wprowadziłem w modelu
3. uruchom poniższe polecenie:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = **** "
4. Usunięto zawartość metod Up () i Down () z pliku migracji i pozostawiono metody puste
5. uruchom poniższe polecenie:
Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Źródło danych = DESKTOP \ SQLEXPRESS; Katalog początkowy = Niestandardowe; Trwałe informacje o zabezpieczeniach = Prawda; Identyfikator użytkownika = sa; hasło = " ***
Po wykonaniu powyższego kroku model i DB wyglądają synchronicznie.
Teraz dodałem nowe właściwości w modelu
Uruchom poniższe polecenie:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
Teraz plik migracji zawiera tylko moje ostatnie zmiany, jak poniżej:
Uruchom poniższe polecenie: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
11. Teraz pomyślnie zaktualizowałem bazę danych o dodatkowe kolumny.
Poniższa tabela jest zaktualizowana po ostatnich zmianach:
Tabela po migracji aktualizacji
źródło
W pliku migracji sprawdź publiczną metodę override void Up () . Być może próbujesz utworzyć nowy obiekt bazy danych, który jest już w bazie danych. Tak więc musisz usunąć ten obiekt / tabelę przed utworzeniem obiektu db. Po prostu rób jak poniżej-
A teraz uruchom migrację
Update-Database -TargetMigration: "2016_YourMigration"
źródło