In der Datenbank befindet sich bereits ein Objekt mit dem Namen

115

Update-Datenbank von Package Manager Console fehlgeschlagen. Ich habe Entity Framework 6.x und Code-First-Ansatz verwendet. Fehler ist

"In der Datenbank befindet sich bereits ein Objekt mit dem Namen 'AboutUs'."

Wie kann ich dieses Problem lösen?

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

    }
}

Mein DbContext ist:

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

Paketverwaltungskonsole:

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> 
Sagte Roohullah Allem
quelle
Wie kann ich das machen (Zuordnung zu vorhandenem Design)?
Sagte Roohullah Allem
15
@HLGEM, Wenn "gut gestaltete Datenbank" mit EF einem Objektmodell zugeordnet werden kann, kann EF es auch generieren. DB-Migrationen sind ein leistungsstarkes Tool, das die Bereitstellung Ihrer Datenbank erleichtert. Ich würde nicht empfehlen, DB-Migrationen zu vermeiden. Andernfalls werden ohnehin Patch-Skripte benötigt. Ich würde empfehlen, DB-Migrationen richtig zu verwenden.
Ilya Palkin

Antworten:

128

Es scheint, dass ein Problem im Migrationsprozess vorliegt. Führen Sie den Befehl add-migration in "Package Manager Console" aus:

Add-Migration Initial -IgnoreChanges

Nehmen Sie einige Änderungen vor und aktualisieren Sie dann die Datenbank aus der "Initial" -Datei:

Update-Datenbank -verbose

Bearbeiten: -IgnoreChanges ist in EF6, aber nicht in EF Core. Hier ist eine Problemumgehung: https://stackoverflow.com/a/43687656/495455

Sina Amirshekari
quelle
8
Was macht das genau? Ermöglicht dies dem neuen Modell, nur das alte zu überschreiben?
Travis Tubbs
1
Ich habe angefangen, manuelle Migrationen zu verwenden, weil ich sowohl Ansichten als auch Tabellen in meiner Datenbank verwende. Ich habe den Fehler gemacht, automatische Migrationen zu verwenden, und als Ergebnis wurde versucht, eine Tabelle aus einer Ansicht zu erstellen. In diesem Szenario funktioniert Ihre Lösung nicht. Stattdessen sollte ich immer manuelle Migrationen verwenden. Danach musste ich die Änderungen in der Quellcodeverwaltung rückgängig machen und den Eintrag "Initial" aus der Tabelle _Migrations entfernen.
Arame3333
3
Dies führt mich nur in eine Endlosschleife: Die Package Manager-Konsole lässt mich keine Add-Migration durchführen, da der Fehler "Eine explizite Migration kann nicht generiert werden, da die folgenden expliziten Migrationen ausstehen ..." angezeigt wird, nämlich InitialCreate. Aber wenn ich diese Update-Datenbank nicht erfolgreich ausführen kann, BIS es auch einige Initial -IgnoreChanges gibt, was soll ich dann tun?
Östlich von Nirgendwo
6
Add-Migration: Es wurde kein Parameter gefunden, der dem Parameternamen 'IgnoreChanges' entspricht.
Tzvi Gregory Kaidanov
3
@TravisTubbs ignoriert die von Ihnen vorgenommenen Änderungen und "fälscht", dass Ihr Modell in Bezug auf die Migrationstabelle mit der Datenbank synchronisiert ist. Sie müssen die beiden noch manuell synchronisieren. In meinem Fall habe ich die am Modell vorgenommenen Änderungen entfernt, eine Add-Migration durchgeführt und den Inhalt aus den Up / Down-Methoden entfernt, bevor ich die Update-Datenbank durchgeführt habe. Dadurch bin ich in den Status vor der Unterbrechung der Migration zurückgekehrt. Dann habe ich die Änderungen erneut hinzugefügt, die Migration hinzugefügt und die Datenbank wie gewohnt aktualisiert - diesmal alles synchronisiert
David Refaeli
73

Vielleicht haben Sie den Namespace in Ihrem Projekt geändert!
In Ihrer Datenbank befindet sich eine Tabelle mit dem Namen dbo.__MigrationHistory. Die Tabelle hat eine Spalte mit dem Namen ContextKey.
Der Wert dieser Spalte basiert auf Ihrem namespace. zum Beispiel ist " DataAccess.Migrations.Configuration".
Wenn Sie den Namespace ändern, werden doppelte Tabellennamen mit unterschiedlichen Namespaces verursacht.
Nachdem Sie den Namespace auf der Codeseite geändert haben, ändern Sie auch den Namespace in dieser Tabelle in der Datenbank (für alle Zeilen).
Wenn Sie beispielsweise den Namespace in ändern EFDataAccess, sollten Sie die Werte der ContextKeySpalte in dbo.__MigrationHistory" EFDataAccess.Migrations.Configuration" ändern .
Verwenden Sie dann auf der Codeseite in Tools => Package Manager Console den update-databaseBefehl.

Eine andere Option, anstatt den Kontextwert in der Datenbank zu ändern, besteht darin, den Kontextwert in Ihrem Code fest auf den alten Namespace-Wert zu codieren. Dies ist möglich, indem Sie erben DbMigrationsConfiguration<YourDbContext>und im Konstruktor einfach den alten Kontextwert zuweisen ContextKey, dann von MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>dieser Klasse erben und leer lassen. Als letztes müssen Sie Database.SetInitializer(new YourDbInitializer());Ihren DbContext in einem statischen Konstruktor aufrufen.

Ich hoffe, Ihr Problem wird behoben.

Elnaz
quelle
9
Super, wir hatten genau dieses Problem!
Olivier ROMAND
3
Eigentlich ist dies die wahre Ursache für diesen Fehler. EF versucht, eine Datenbank zu erstellen, da es aufgrund des Namensraumunterschieds nicht lesen kann, welche Migrationen auf die Datenbank angewendet werden
UfukSURMEN
Dank dieser Antwort hat mir sehr geholfen, wie Olivier ROMAND sagte, ich hatte genau dieses Problem!
Enrique A. Pinelo Novelo
Ich hatte keine Ahnung, dass es damit zusammenhängt, aber irgendwie hat es sogar das Entfernen der Datensätze der MigrationHistoryTabelle nicht für mich behoben ... also habe ich alle meine Tabellen gelöscht und EF sie alle erneut erstellen lassen, kleine App, keine große Sache. ..aber es hat es für mich behoben.
Niklas
Dies ist die richtige Antwort mit Details, auch gut zu erwähnen, dass manchmal falsch geschriebene Ordnernamen dieses Problem verursachen.
H35am
17

"In der Datenbank befindet sich bereits ein Objekt mit dem Namen 'AboutUs'."

Diese Ausnahme zeigt an, dass jemand der Datenbank bereits ein Objekt mit dem Namen "AboutUs" hinzugefügt hat.

AutomaticMigrationsEnabled = true;kann dazu führen, da Datenbankversionen in diesem Fall nicht von Ihnen kontrolliert werden. Um unvorhersehbare Migrationen zu vermeiden und sicherzustellen, dass jeder Entwickler im Team mit derselben Datenbankstruktur arbeitet, schlage ich vor, dass Sie diese festlegenAutomaticMigrationsEnabled = false; .

Automatische Migrationen und codierte Migrationen können nebeneinander stehen, wenn Sie sehr vorsichtig sind und der einzige Entwickler in einem Projekt sind.

Es gibt ein Zitat aus dem Beitrag "Automatische Code-Erstmigrationen" im Data Developer Center :

Mit automatischen Migrationen können Sie Code First Migrations verwenden, ohne für jede Änderung, die Sie vornehmen, eine Codedatei in Ihrem Projekt zu haben. Nicht alle Änderungen können automatisch übernommen werden. Beispielsweise erfordern Spaltenumbenennungen die Verwendung einer codebasierten Migration.

Empfehlung für Teamumgebungen

Sie können automatische und codebasierte Migrationen verteilen, dies wird jedoch in Teamentwicklungsszenarien nicht empfohlen. Wenn Sie Teil eines Entwicklerteams sind, das die Quellcodeverwaltung verwendet, sollten Sie entweder rein automatische Migrationen oder rein codebasierte Migrationen verwenden. Angesichts der Einschränkungen automatischer Migrationen empfehlen wir die Verwendung codebasierter Migrationen in Teamumgebungen.

Ilya Palkin
quelle
12

In meinem Fall wurde mein EFMigrationsHistoryTisch (irgendwie) geleert und beim Versuch zu rennen bekam update-databaseich:

In der Datenbank befindet sich bereits ein Objekt mit dem Namen 'AspNetUsers'

Nachdem die Tabelle geleert wurde, war es sinnvoll, die anfängliche Migration erneut auszuführen und die Tabellen neu zu erstellen.

Um dieses Problem zu beheben, habe ich meiner EFMigrationsHistoryTabelle Zeilen hinzugefügt . 1 Zeile für jede Migration, von der ich wusste, dass die Datenbank auf dem neuesten Stand ist.

Eine Zeile hat 2 Spalten: MigrationIdundProductVersion

MigrationIdist der Name Ihrer Migrationsdatei. Beispiel:20170628112345_Initial

ProductVersionist die ef-Version, die Sie ausführen. Sie finden dies, indem Sie Get-Packagein die Package Manager-Konsole tippen und nach Ihrem ef-Paket suchen.

Hoffe das ist hilfreich für jemanden.

Kolby
quelle
1
Wie haben Sie die Spalte Modell ausgefüllt?
Ciaran Gallagher
7

In meinem Fall hatte ich die Assembly, die das Code-First-Entity-Framework-Modell enthielt, umbenannt. Obwohl sich das eigentliche Schema in der aufgerufenen Migrationstabelle überhaupt nicht geändert hatte

dbo.__MigrationHistory

enthält eine Liste bereits durchgeführter Migrationen basierend auf dem alten Assemblynamen. Ich habe den alten Namen in der Migrationstabelle so aktualisiert, dass er mit dem neuen übereinstimmt, und die Migration hat dann wieder funktioniert.

Der Senator
quelle
5

Stellen Sie sicher, dass Ihr Lösungsstartprojekt die richtige Verbindungszeichenfolge in der Konfigurationsdatei hat. Oder legen Sie den Parameter -StartUpProjectName fest, wenn Sie den Befehl update-database ausführen. Der Parameter -StartUpProjectName gibt die Konfigurationsdatei an, die für benannte Verbindungszeichenfolgen verwendet werden soll. Wenn nicht angegeben, wird die Konfigurationsdatei des angegebenen Projekts verwendet.

Hier ist ein Link für ef-migrationsbefehlsreferenzen http://coding.abel.nu/2012/03/ef-migrations-command-reference/

Ryan Layton
quelle
Diese Antwort führte mich zu meinem Fehler, ich hatte einfach das falsche Projekt als Startup-Projekt.
Martin Johansson
Ich hatte ein ähnliches Problem und dies hat es für mich behoben.
JordanTDN
3

Ich hatte das gleiche Problem und nach drei Stunden Kampf finde ich heraus, was los ist

In meinem Fall, wenn ich zum ersten Mal in der up()Methode migrieren wollte, möchte der Standardcode die bereits vorhandenen Tabellen erstellen, sodass ich den gleichen Fehler wie Sie erhalten habe

Um es zu lösen, löschen Sie einfach den Code und schreiben Sie, was Sie wollen. Zum Beispiel wollte ich eine Spalte hinzufügen, damit ich nur schreibe

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);
arfa
quelle
Sieht nach einer guten Antwort aus, aber vielleicht möchten Sie Ihre Rechtschreibung überprüfen. Sie können auch Codefragmente verwenden, um zu verdeutlichen, dass die letzte Zeile Code ist. Nachricht an mich, wenn Sie dabei Hilfe benötigen.
Mike Poole
Danke Wie kann ich Sie massieren
Arfa
1
Gut gemacht für das Hinzufügen des Code-Snippets @arfa. Keine Notwendigkeit für eine Massage :). Wenn Sie mir eine Nachricht senden möchten, geben Sie einfach @gefolgt von meinem Benutzernamen in den Kommentaren ein.
Mike Poole
3

Hinweis: Nicht empfohlene Lösung. aber in einigen Fällen schnelle Lösung.

Für mich dbo._MigrationHistoryfehlten in der Produktionsdatenbank Migrationsdatensätze während des Veröffentlichungsprozesses, aber die Entwicklungsdatenbank hatte alle Migrationsdatensätze.

Wenn Sie sicher sind, dass die Produktionsdatenbank im Vergleich zur Entwicklungsdatenbank das gleiche und neueste Schema hat, kann das Problem durch Kopieren aller Migrationsdatensätze in die Produktionsdatenbank behoben werden.

Sie können nur mit VisualStudio arbeiten.

  1. Öffnen Sie das Fenster 'SQL Server Object Explorer'> klicken Sie mit der rechten Maustaste auf die dbo._MigrationHistoryTabelle in der Quelldatenbank (in meinem Fall dev db)> Klicken Sie auf das Menü "Datenvergleich ...".
  2. Anschließend wurde der Datenvergleichs-Assistent angezeigt. Wählen Sie die Zieldatenbank (in meinem Fall Produktionsdatenbank) aus und klicken Sie auf Weiter.
  3. Einige Sekunden später werden einige Datensätze nur in der Quellendatenbank angezeigt. Klicken Sie einfach auf die Schaltfläche "Ziel aktualisieren".
  4. Klicken Sie im Browser auf die Schaltfläche "Aktualisieren" und die Fehlermeldung wird angezeigt.

Beachten Sie, dass dies auch bei komplexen und seriösen Projekten nicht empfohlen wird. Verwenden Sie diese Option nur, wenn Sie Probleme beim Lernen von ASP.Net oder EntityFramework haben.

Youngjae
quelle
1
Das hat bei mir funktioniert. Es war jedoch umgekehrt. Meine Produktionsdatenbank hatte alle Datensätze in __EFMigrationHistory, während die in dev db irgendwie fehlten (mit Ausnahme der ersten).
Jens Mander
1

Löschen Sie Zeilen aus der Tabelle dbo_MigrationHistory oder löschen Sie die Tabelle und führen Sie sie aus

update-database -verbose

Es werden alle Migrationen in Ihrem Projekt einzeln ausgeführt

Ali Adravi
quelle
1

In meinem Fall war das Problem in Seeder. Ich habe _ctx.Database.EnsureCreated () darin aufgerufen und soweit ich verstanden habe, wurde der Befehl zum Aktualisieren der Datenbank erfolgreich ausgeführt, aber dann hat Seeder versucht, die Datenbank "zum zweiten Mal" zu erstellen.

Wie zu adressieren:

  1. Führen Sie ein Update durch, starten Sie einfach die Anwendung und rufen Sie EnsureCreated () auf. Die Datenbank wird erstellt / aktualisiert
  2. Sämaschine auskommentieren oder entfernen.
Chekusty
quelle
1

Ein weiteres Edge-Case-EF-Core-Szenario.

Überprüfen Sie, ob Sie eine Datei Migrations / YOURNAMEContextModelSnapshot.cs haben .

wie in - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration beschrieben

Wenn Sie versucht haben, Ihre Datenbank manuell neu zu erstellen, indem Sie die Dateien migration.cs löschen, achten Sie darauf, dass Ihre Datei Migrations / * ContextModelSnapshot.cs noch vorhanden ist.

Ohne diese Option haben Ihre nachfolgenden Migrationen keinen Snapshot, mit dem Sie die erforderlichen Unterschiede erstellen können, und Ihre neuen Migrationsdateien sehen so aus, als würden sie alles von Grund auf neu erstellen. Anschließend wird der vorhandene Tabellenfehler wie oben angezeigt.

WickedW
quelle
1

Das gleiche passierte mit mir. Das Problem war, dass ich tatsächlich meine Datenbanktabelle gelöscht MoviesCastund eine neue Tabelle erstellt habe. Das Problem war, dass meine letzte Migration versuchte, die gelöschte Tabelle MoviesCastin der Datenbank zu induzieren . Ich habe es gelöst, indem ich einfach den gesamten Inhalt der letzten Migration entfernt und einfach die Up () & down () -Methode ausgeführt habe

public override void Up()
{
}

public override void Down()
{
}

Aktualisieren Sie dann die Datenbank und fügen Sie einfach eine neue Migration hinzu

Chamäleon
quelle
1

Ich hatte das gleiche Problem in der Antwort beschrieben, die Elnaz gab. Ich musste den Namespace der Datenschicht während eines Refactorings unseres Projekts ändern. Dies führte dazu, dass die Migrationen die vorhandenen Migrationen nicht in der Datenbank sahen. Ich habe eine ausgezeichnete Antwort auf dieses Problem gefunden, das James Chambers gebloggt hat.

http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

Ich habe einfach Folgendes in der Migrationskonfigurationsdatei geändert.

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

Hoffe, dies hilft jemand anderem in einer Bindung.

Nathan
quelle
Ich hatte eine ähnliche Situation nach Namespace-Änderungen. Versuchte dieses Update, aber es funktionierte immer noch nicht. Also habe ich Namespaces in der Datenbanktabelle manuell geändert und dann fing es an zu funktionieren.
Kosist
0

Führen Sie einfach den Befehl update-migration -Script aus. Dadurch wird ein neues * .sql-Skript generiert, das alle in der Migration enthaltenen DB-Änderungen enthält. Am Ende des Codes befinden sich Einfügebefehle wie folgt: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) Sie können dies einfach ausführen. INSERT und DB werden synchronisiert

Rasto
quelle
0

Nachdem ich mehr als eine Stunde lang keine Ergebnisse erhalten hatte, versuchte ich einen anderen Ansatz, ohne Migrationen, aber ich führte einen Schemavergleich durch.

In Visual Studio -> Tools -> SQL Server -> Neuer Schema-Vergleich

Zuerst habe ich eine neue, völlig neue Datenbank mit EF-Migrationen erstellt. Dann habe ich einen Vergleich durchgeführt und die neue Datenbank mit der verglichen, die ich aktualisieren wollte. Schließlich wurde ein Migrationsskript generiert, und ich konnte ein Schema-Update durchführen.

FrankyHollywood
quelle
0

In meinem Fall (möchten zurücksetzen und eine neue Datenbank erhalten),

Zuerst habe ich die Fehlermeldung bekommen: There is already an object named 'TABLENAME' in the database.

und ich sah ein wenig vorher:

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

Meine Datenbank wurde erstellt, aber kein Datensatz im Migrationsverlauf.

Ich lösche alle Tabellen außer dbo .__ MigrationsHistory

MigrationsHistory war leer.

Lauf dotnet ef database update -c StudyContext --verbose

(--verbose nur zum Spaß)

und bekam Done.

JohnFI
quelle
0

Ich hatte den gleichen Fehler wie unten. Dann habe ich es wie folgt behoben:

  1. Überprüfen Sie die aktuellen Datenbanken in Ihrem Projekt:
    • dotnet ef migrations list
  2. Wenn Sie das Neueste hinzugefügt haben, entfernen Sie es:
    • dotnet ef migrations remove
  3. Garantieausgaben dieser Datenbank müssen im Quellcode aufgelöst werden: .cs / .Designer.cs-Dateien

4. Jetzt ist es gut. Versuchen Sie erneut hinzuzufügen: dotnet ef migrations add [new_dbo_name]

5. Versuchen Sie abschließend erneut, die Aktualisierung auf der Grundlage der Migrationsliste erneut durchzuführen:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

Hoffe es ist hilfreich für dich. ^^

Mai Nguyen
quelle
0

Sie haben den Migrationsordner gelöscht, als Sie versuchen, den Befehl "update-database" auf der Package Manager-Konsole auszuführen? wenn ja

Löschen Sie einfach alle Ihre Tabellen manuell als ausgeführt, wenn update-database (Nachteile-Seed-Daten werden gelöscht)

Alok Singh
quelle
0

Eine andere Möglichkeit, dies zu tun, besteht darin, alles in der Anfangsklasse zwischen den Up- und Down-Methoden zu kommentieren. Führen Sie dann die Update-Datenbank aus, nachdem die Seed-Methode erfolgreich ausgeführt wurde. Führen Sie die Update-Datenbank erneut aus. Dies ist möglicherweise für einige Freunde hilfreich.

Iman Mohadesi
quelle
0

Ich stand vor dem gleichen Problem. Ich habe die folgende Lösung ausprobiert: 1. Löscht den Tabellencode von Up () und den zugehörigen Code von der Down () -Methode. 2. Führen Sie den Befehl update-database in Package Manager Consol aus

Das hat mein Problem gelöst

Ashu_90
quelle
0

Hinweis: Ich habe es getan, weil ich nichts in meiner Datenbank habe. In meinem Fall: 1. Ich habe eine Migration mit dem Befehl remove-migration in der Package Manager-Konsole entfernt. 2. Die Datenbank wurde im Bereich "SQL Server-Objekt-Explorer"> in der aktuellen Datenbank entfernt.> Klicken Sie mit der rechten Maustaste auf> Entfernen. 3. Migrieren Sie in die Package Manager-Konsole. Schreiben Sie Hinzufügen -Migration und klicken Sie auf Enter 4. Das letzte Update per Befehl update-database

Erasyl Abenov
quelle
0

Gleicher Fall (keine DB- und MigrationHistory-Tabelle auf dem Server). Meine Schritte:

  1. Ich habe Migrationsdaten aus dem Auf- und Ab-Bereich meiner ersten Migration gelöscht.
  2. Datenbank mit leerer Migration aktualisieren (MigrationHistory-Tabelle wurde erstellt)
  3. Fügen Sie Ihre REAL-Migration hinzu und aktualisieren Sie die Datenbank damit.
Vasiliy Terkin
quelle
0

Fragen Sie in der Datenbank die Tabelle __MigrationHistory ab und kopieren Sie [ContextKey].

Fügen Sie es wie folgt in den DbMigrationsConfiguration ConextKey ein

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

Die folgenden Schritte haben bei mir für dasselbe Problem funktioniert:

Szenario:

Ich habe versucht, meinem vorhandenen Modell für die E-Mail-Funktionalität zwei neue Felder hinzuzufügen. Die neuen Felder sind "IsEmailVerified" und "ActivationCode".

Schritte, die ich befolgt habe:

1. Löschte alte Migrationsdateien im Ordner "Migrationen", die mich daran hinderten, die Update-Datenbank durchzuführen. 2. Alle meine letzten Änderungen, die ich am Modell vorgenommen habe, wurden wiederholt

3. Führen Sie den folgenden Befehl aus:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Datenquelle = DESKTOP \ SQLEXPRESS; Erstkatalog = Benutzerdefiniert; Sicherheitsinformationen beibehalten = True; Benutzer-ID = sa; Kennwort = **** "

4. Löschte den Inhalt der Methoden Up () und Down () aus der Migrationsdatei und ließ die Methoden leer

5. Führen Sie den folgenden Befehl aus:

Update-Datenbank -ConnectionProviderName System.Data.SqlClient -ConnectionString "Datenquelle = DESKTOP \ SQLEXPRESS; Erstkatalog = Benutzerdefiniert; Sicherheitsinformationen beibehalten = True; Benutzer-ID = sa; Kennwort = " ***

  1. Nachdem der obige Schritt ausgeführt wurde, sehen Modell und Datenbank synchron aus.

  2. Jetzt habe ich die neuen Eigenschaften im Modell hinzugefügt

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Führen Sie den folgenden Befehl aus:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Datenquelle = DESKTOP \ SQLEXPRESS; Erstkatalog = Benutzerdefiniert; Sicherheitsinformationen beibehalten = True; Benutzer-ID = sa; Kennwort = " ***

  1. Jetzt enthält die Migrationsdatei nur meine letzten Änderungen wie folgt:

       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. Führen Sie den folgenden Befehl aus: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Datenquelle = DESKTOP \ SQLEXPRESS; Erstkatalog = Benutzerdefiniert; Sicherheitsinformationen beibehalten = True; Benutzer-ID = sa; Kennwort = " ***

11. Jetzt habe ich die Datenbank erfolgreich mit zusätzlichen Spalten aktualisiert.

Die folgende Tabelle wurde nach den letzten Änderungen aktualisiert:

Tabelle nach der Update-Migration

Thamizh
quelle
-5

Überprüfen Sie in der Migrationsdatei die Methode public Upide void Up () . Möglicherweise versuchen Sie, ein neues Datenbankobjekt zu erstellen, das sich bereits in der Datenbank befindet. Sie müssen dieses Objekt / diese Tabelle also löschen, bevor Sie das Datenbankobjekt erstellen. Mach es einfach wie unten.

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

Führen Sie jetzt Ihre Migration aus Update-Database -TargetMigration: "2016_YourMigration"

Mohammad Al-Hasan
quelle
6
Wenn Sie dies tun, verlieren Sie alle Ihre Daten
Mehdiway