W bazie danych istnieje już obiekt o nazwie


115

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> 

Jak mogę to zrobić (mapowanie do istniejącego projektu)?
— powiedział Roohullah Allem

15
@HLGEM, jeśli „dobrze zaprojektowana baza danych” może być zamapowana na model obiektu przy użyciu EF, wówczas EF jest w stanie ją również wygenerować. Migracje bazy danych to potężne narzędzie, które ułatwia wdrażanie bazy danych. Nie polecam unikania migracji bazy danych. W przeciwnym razie i tak potrzebne są skrypty łatek. Zalecałbym prawidłowe korzystanie z migracji bazy danych.
— Ilya Palkin

Odpowiedzi:


129

wygląda na to, że wystąpił problem w procesie migracji, uruchom polecenie add-migration w "Konsoli menedżera pakietów":

Add-Migration Initial -IgnoreChanges

zrób kilka zmian, a następnie zaktualizuj bazę danych z pliku "Initial":

Update-Database -verbose

Edycja: -IgnoreChanges znajduje się w EF6, ale nie w EF Core, oto obejście: https://stackoverflow.com/a/43687656/495455


8
Co to dokładnie robi? Czy to pozwala nowemu modelowi po prostu nadpisać stary?
— Travis Tubbs

1
Zacząłem używać migracji ręcznych, ponieważ w mojej bazie danych używam zarówno widoków, jak i tabel. Popełniłem błąd, próbując użyć automatycznych migracji, w wyniku czego próbowałem utworzyć tabelę z widoku. W tym scenariuszu Twoje rozwiązanie nie działa, zamiast tego powinienem zawsze używać ręcznych migracji. Po wykonaniu tej czynności musiałem cofnąć zmiany w kontroli źródła i usunąć wpis „Initial” z tabeli _Migrations.
— arame3333

3
To po prostu prowadzi mnie do nieskończonej pętli: konsola menedżera pakietów nie pozwala mi wykonać migracji dodawania, ponieważ wyświetla błąd „Nie można wygenerować jawnej migracji, ponieważ oczekują następujące jawne migracje ...”, a mianowicie plik InitialCreate. Ale jeśli nie mogę pomyślnie uruchomić tej aktualizacji bazy danych, AŻ do wystąpienia pewnych początkowych -IgnoreChanges, to co mam zrobić?
— East of Nowhere

6
Add-Migration: nie można znaleźć parametru zgodnego z nazwą parametru „IgnoreChanges”.
— Cwi Gregory Kaidanov

3
@TravisTubbs to ignoruje wprowadzone zmiany i „udaje”, że model jest zsynchronizowany z bazą danych w odniesieniu do tabeli migracji. Nadal musisz ręcznie zsynchronizować oba; W moim przypadku usunąłem zmiany wprowadzone w modelu, zrobiłem Add-Migration, usunąłem zawartość z metod up / down przed wykonaniem update-database - to przywróciło mi stan sprzed zerwania migracji. Potem faktycznie ponownie dodałem zmiany, dodałem migrację i zaktualizowałem bazę danych jak zwykle - tym razem wszystko się zsynchronizowało
— David Refaeli

73

Może zmieniłeś przestrzeń nazw w swoim projekcie!
W Twojej bazie danych znajduje się tabela o nazwie dbo.__MigrationHistory. Tabela zawiera kolumnę o nazwie ContextKey.
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ści ContextKeykolumny w dbo.__MigrationHistoryna „ EFDataAccess.Migrations.Configuration”.
Następnie po stronie kodu, w Tools => Package Manager Console, użyj update-databasepolecenia.

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 do ContextKey, a następnie dziedziczenie z MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>i pozostawienie tej klasy pustej. Ostatnią rzeczą do zrobienia jest wywołanie Database.SetInitializer(new YourDbInitializer());w swoim DbContext w konstruktorze statycznym.

Mam nadzieję, że Twój problem zostanie rozwiązany.


9
Wspaniale, mieliśmy dokładnie ten problem!
— Olivier ROMAND

3
W rzeczywistości jest to prawdziwa przyczyna tego błędu. EF próbuje utworzyć bazę danych, ponieważ nie może odczytać, które migracje są stosowane do bazy danych z powodu różnicy nazw w przestrzeni
— UfukSURMEN

Dzięki tej odpowiedzi bardzo mi pomogła, jak powiedział Olivier ROMAND, miałem dokładnie ten problem!
— Enrique A. Pinelo Novelo

Nie miałem pojęcia, że ​​to jest z tym związane, ale jakoś nawet usunięcie rekordów MigrationHistorytabeli 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.
— Niklas

To jest poprawna odpowiedź ze szczegółami, warto również wspomnieć, że czasami błędna nazwa folderu może powodować ten problem.
— H35am

17

„W bazie danych istnieje już obiekt o nazwie„ AboutUs ”.”

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 :

Automatyczne migracje umożliwiają korzystanie z migracji Code First bez konieczności posiadania pliku kodu w projekcie dla każdej wprowadzanej zmiany. Nie wszystkie zmiany można zastosować automatycznie - na przykład zmiana nazw kolumn wymaga użycia migracji opartej na kodzie.

Zalecenie dla środowisk zespołowych

Migracje automatyczne i oparte na kodzie można przeplatać, ale nie jest to zalecane w scenariuszach tworzenia zespołów. Jeśli należysz do zespołu programistów korzystających z kontroli źródła, powinieneś albo używać czysto automatycznych migracji, albo wyłącznie migracji opartych na kodzie. Biorąc pod uwagę ograniczenia migracji automatycznych, zalecamy korzystanie z migracji opartych na kodzie w środowiskach zespołowych.


12

W moim przypadku mój EFMigrationsHistorystół został (jakoś) opróżniony i przy próbie uruchomienia update-databasedostałem:

W bazie danych istnieje już obiekt o nazwie „AspNetUsers”

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 EFMigrationsHistorytabeli. 1 wiersz dla każdej migracji, o której wiedziałem, że baza danych jest aktualna.

Wiersz będzie miał 2 kolumny: MigrationIdiProductVersion

MigrationIdto nazwa pliku migracji. Przykład:20170628112345_Initial

ProductVersionto wersja ef, którą używasz. Możesz to znaleźć, wpisując Get-Packagedo konsoli menedżera pakietów i szukając swojego pakietu ef.

Mam nadzieję, że to jest pomocne dla kogoś.


1
Jak wypełniłeś kolumnę Model?
— Ciaran Gallagher

7

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

dbo.__MigrationHistory

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.


5

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/


Ta odpowiedź doprowadziła mnie do błędu, po prostu miałem zły projekt jako projekt Startup.
— Martin Johansson,

Miałem podobny problem i to rozwiązało go dla mnie.
— JordanTDN,

3

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 ty

Aby go rozwiązać, po prostu usuń ten kod i napisz, co chcesz. Na przykład chciałem dodać kolumnę, więc po prostu piszę

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);

Wygląda na dobrą odpowiedź, ale możesz chcieć sprawdzić pisownię. Możesz również użyć fragmentów kodu, aby wyjaśnić, że ostatnia linia to kod. Napisz do mnie, jeśli potrzebujesz pomocy.
— Mike Poole,

Dzięki. Jak mogę ci masować
— arfa

1
Dobra robota za dodanie fragmentu kodu @arfa. Nie ma potrzeby masażu :). Jeśli chcesz wysłać mi wiadomość, po prostu wpisz @moją nazwę użytkownika w sekcji komentarzy.
— Mike Poole,

3

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.

  1. Otwórz panel „Eksplorator obiektów SQL Server”> kliknij prawym przyciskiem myszy dbo._MigrationHistory tabelę w źródłowej (w moim przypadku dev db) bazie danych> kliknij menu „Porównanie danych ...”.
  2. Następnie pojawił się kreator porównania danych, wybierz docelową bazę danych (w moim przypadku produkcyjną) i kliknij Dalej.
  3. Kilka sekund później pokaże niektóre rekordy tylko w źródłowej bazie danych. wystarczy kliknąć przycisk „Aktualizuj cel”.
  4. W przeglądarce naciśnij przycisk odświeżania i zobacz, że komunikat o błędzie zniknął.

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.


1
To zadziałało dla mnie. Jednak było odwrotnie. Moja baza produkcyjna miała wszystkie rekordy w __EFMigrationHistory, podczas gdy te w bazie deweloperskiej w jakiś sposób ich brakowało (z wyjątkiem początkowego).
— Jens Mander

1

Usuń wiersze z tabeli dbo_MigrationHistory lub usuń tabelę i uruchom

update-database -verbose

Uruchomi po kolei wszystkie migracje w Twoim projekcie


1

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

  1. Wykonaj nutową aktualizację, po prostu uruchom aplikację i wywołaj Guarantecreated (). Baza danych zostanie utworzona / zaktualizowana
  2. Skomentuj lub usuń siewnik.

1

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.


1

to samo stało się ze mną. Problem polegał na tym, że faktycznie usunąłem tabelę bazy danych MoviesCasti utworzyłem nową tabelę, a problem polegał na tym, że moja ostatnia migracja próbowała wywołać usuniętą tabelę MoviesCastw bazie danych. Rozwiązałem to, po prostu usuwając całą zawartość ostatniej migracji i po prostu uruchomiłem metodę Up () i down ()

public override void Up()
{
}

public override void Down()
{
}

następnie zaktualizował bazę danych i po prostu dodaj nową migrację


1

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.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}

Mam nadzieję, że to pomoże komuś innemu w trudnej sytuacji.


Miałem podobną sytuację po zmianie przestrzeni nazw. Wypróbowałem tę poprawkę, ale nadal nie działało. Więc ręcznie zmodyfikowałem przestrzenie nazw w tabeli bazy danych, a potem zaczęło działać.
— kosist

0

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


0

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.


0

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:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

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.


0

Napotkałem ten sam błąd, co poniżej. Następnie naprawiłem to jak poniżej:

  1. Sprawdź aktualne bazy danych w swoim projekcie:
    • dotnet ef migrations list
  2. Jeśli najnowszy jest tym, co dodałeś, usuń go:
    • dotnet ef migrations remove
  3. Dane wyjściowe gwarancji z tej bazy danych należy oddzielić w kodzie źródłowym: pliki .cs / .Designer.cs

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


0

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)


0

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.


0

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


0

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


0

Ten sam przypadek (brak tabeli DB i MigrationHistory na serwerze). Moje kroki:

  1. Usunąłem dane migracji z sekcji W górę iw dół mojej pierwszej migracji.
  2. Zaktualizuj bazę danych z pustą migracją (utworzono tabelę MigrationHistory)
  3. Dodaj swoją PRAWDZIWĄ migrację i zaktualizuj za jej pomocą bazę danych.

0

W bazie danych wyślij zapytanie do tabeli __MigrationHistory i skopiuj [ContextKey].

Wklej go do DbMigrationsConfiguration ConextKey, jak poniżej

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
    {
        public DbConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "<contextKey from above>";
        }

0

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 = " ***

  1. Po wykonaniu powyższego kroku model i DB wyglądają synchronicznie.

  2. Teraz dodałem nowe właściwości w modelu

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  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 = " ***

  1. Teraz plik migracji zawiera tylko moje ostatnie zmiany, jak poniżej:

       public override void Up()
         {
             AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
             AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
         }        
         public override void Down()
         {
             DropColumn("dbo.UserAccounts", "ActivationCode");
             DropColumn("dbo.UserAccounts", "IsEmailVerified");
         }
  2. 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


Naprawdę nie polecam tego, usuwanie migracji produktów po prostu zniszczy twoje środowiska. dlaczego miałbyś usuwać migracje, jeśli do tej pory działały? a parametry połączenia nie będą działać dla każdego użytkownika tutaj, nie powinieneś ich tak uruchamiać
— rakuens

-5

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-

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

A teraz uruchom migrację Update-Database -TargetMigration: "2016_YourMigration"


6
Jeśli to zrobisz, stracisz wszystkie swoje dane
— Mehdiway
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.