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> 
Powiedział Roohullah Allem
źródło
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

Sina Amirshekari
źródło
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.

Elnaz
źródło
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.

Ilya Palkin
źródło
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ś.

Kolby
źródło
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.

Senator
źródło
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/

Ryan Layton
źródło
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);
arfa
źródło
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.

Youngjae
źródło
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

Ali Adravi
źródło
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.
Chekusty
źródło
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.

WickedW
źródło
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ę

Kameleon
źródło
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.

Nathan
źródło
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

Rasto
źródło
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.

FrankyHollywood
źródło
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.

JohnFI
źródło
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. ^^

Mai Nguyen
źródło
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)

Alok Singh
źródło
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.

iman mohadesi
źródło
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

Ashu_90
źródło
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

Erasyl Abenov
źródło
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.
Wasilij Terkin
źródło
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>";
        }
LastTribunal
źródło
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

Thamizh
źródło
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"

Mohammad Al-Hasan
źródło
6
Jeśli to zrobisz, stracisz wszystkie swoje dane
Mehdiway