wake-up-neo.com

Es gibt bereits ein Objekt in der Datenbank

Update-Datenbank ist in Package Manager Console fehlgeschlagen

"Es gibt bereits ein Objekt mit dem Namen 'AboutUs' in der Datenbank."

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> 
87
Jahan

anscheinend gibt es ein Problem im Migrationsprozess. 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

Edit: - IgnoreChanges befindet sich in EF6, jedoch nicht in EF Core. Hier ist eine Problemumgehung: https://stackoverflow.com/a/43687656/495455

113

Vielleicht haben Sie den Namensraum in Ihrem Projekt geändert!
In Ihrer Datenbank gibt es eine Tabelle mit dem Namendbo.__MigrationHistory. Die Tabelle hat eine Spalte namensContextKey.
Der Wert dieser Spalte basiert auf Ihrernamespace. Zum Beispiel ist "DataAccess.Migrations.Configuration".
Wenn Sie den Namespace ändern, führt dies zu doppelten Tabellennamen mit unterschiedlichen Namespaces.
Nachdem Sie den Namespace in 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 EFDataAccess ändern, sollten Sie die Werte der ContextKey-Spalte in dbo.__MigrationHistory in "EFDataAccess.Migrations.Configuration" ändern.
Verwenden Sie dann auf der Codeseite in Tools => Package Manager Console den Befehlupdate-database.

Anstatt den Kontextwert in der Datenbank zu ändern, können Sie auch den Kontextwert in Ihrem Code mit dem alten Namespacewert hart codieren. Dies ist möglich, indem Sie DbMigrationsConfiguration<YourDbContext> erben und im Konstruktor einfach den alten Kontextwert ContextKey zuweisen, dann von MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration> erben und diese Klasse leer lassen. Als letztes müssen Sie Database.SetInitializer(new YourDbInitializer()); in Ihrem DbContext in einem statischen Konstruktor aufrufen.

Ich hoffe dein Problem wird behoben.

60
Elnaz

"Es gibt bereits ein Objekt mit dem Namen 'AboutUs' in der Datenbank."

Diese Ausnahme sagt Ihnen, dass jemand bereits ein Objekt mit dem Namen 'AboutUs' zur Datenbank 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 alle Entwickler im Team mit derselben Datenbankstruktur arbeiten, Ich schlage vor, Sie setzen AutomaticMigrationsEnabled = false;.

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

Im Data Developer Center gibt es ein Zitat von Automatic Code First Migrations :

Bei automatischen Migrationen können Sie Code First Migrations ohne .__ verwenden. Sie müssen für jede durchgeführte Änderung eine Codedatei in Ihrem Projekt haben. Nicht alle Änderungen können automatisch übernommen werden, z. B. umbenennen von Spalten erfordern die Verwendung einer codebasierten Migration.

Empfehlung für Teamumgebungen

Sie können automatische und codebasierte Migrationen durchsetzen, dies ist jedoch nicht in Teamentwicklungsszenarien empfohlen. Wenn Sie Teil eines .__ sind. ein Entwicklerteam, das die Quellcodeverwaltung verwendet, sollten Sie entweder .__ verwenden. rein automatische Migrationen oder rein codebasierte Migrationen. Angenommen Einschränkungen der automatischen Migration empfehlen wir die Verwendung von Code-basierten Migrationen in Teamumgebungen.

16
Ilya Palkin

In meinem Fall wurde meine EFMigrationsHistory-Tabelle geleert (irgendwie) und beim Ausführen von update-database würde ich Folgendes erhalten: 

Es gibt bereits ein Objekt mit dem Namen "AspNetUsers" in der Datenbank

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

Um dieses Problem zu beheben, fügte ich meiner EFMigrationsHistory-Tabelle Zeilen hinzu. 1 Zeile für jede Migration, von der ich wusste, dass die Datenbank aktuell ist.

Eine Zeile hat 2 Spalten: MigrationId und ProductVersion

MigrationId ist der Name Ihrer Migrationsdatei. Beispiel: 20170628112345_Initial

ProductVersion ist die ef-Version, die Sie ausführen. Sie finden dies, indem Sie Get-Package in die Package Manager Console eingeben und nach Ihrem ef-Paket suchen.

Hoffe, das ist für jemanden hilfreich.

7
Kolby

In meinem Fall hatte ich die Assembly umbenannt, die das Code-First-Entity-Framework-Modell enthielt. Obwohl das eigentliche Schema die aufgerufene Migrationstabelle nicht geändert hat

dbo.__MigrationHistory

enthält eine Liste der bereits durchgeführten Migrationen basierend auf dem Namen old Assembly. Ich habe den alten Namen in der Migrationstabelle an den neuen Wert angepasst und die Migration funktionierte dann erneut.

5
The Senator

Stellen Sie sicher, dass das Startprojekt Ihrer Lösung 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-migration-Befehlsreferenzen http://coding.abel.nu/2012/03/ef-migrations-command-reference/

5
Ryan Layton

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

In meinem Fall, als ich zum ersten Mal in der Methode up() migrieren wollte, möchte der Standardcode die bereits vorhandenen Tabellen erstellen, sodass ich denselben Fehler wie Sie erhalte

Um das Problem zu lösen, löschen Sie einfach den Code und schreiben Sie den gewünschten Code. Zum Beispiel wollte ich eine Spalte hinzufügen, also schreibe ich einfach

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

In meinem Fall war das Problem bei Seeder. Ich rief _ctx.Database.EnsureCreated () in sich auf, und soweit ich verstanden habe, wurde der Befehl update database erfolgreich ausgeführt, aber der Seeder versuchte, die Datenbank "zum zweiten Mal" zu erstellen.

Wie ansprechen:

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

Hinweis: nicht empfohlene Lösung. aber in manchen Fällen schnell behoben.

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

Wenn Sie sicher sind, dass die Produktionsdatenbank das gleiche und das neueste Schema im Vergleich zu Entwicklungsdatenbank hat, kopieren Sie alle Migrationsdatensätze in die Produktionsdatenbank, um das Problem zu lösen.

Sie können dies nur in VisualStudio tun.

  1. Öffnen Sie das Fenster "SQL Server Object Explorer"> klicken Sie mit der rechten Maustaste auf die dbo._MigrationHistory-Tabelle in der Quellendatenbank (in meinem Fall dev db)> Klicken Sie auf das Menü "Datenvergleich".
  2. Anschließend öffnete sich der Datenvergleichs-Assistent. Wählen Sie die Zieldatenbank (in meinem Fall Produktions-Datenbank) aus und klicken Sie auf Weiter.
  3. Einige Sekunden später werden einige Einträge nur in der Quellendatenbank angezeigt. Klicken Sie einfach auf die Schaltfläche "Update Target".
  4. Klicken Sie im Browser auf die Schaltfläche "Aktualisieren" und sehen Sie, dass die Fehlermeldung verschwunden ist.

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

1
Youngjae

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 nacheinander ausgeführt

1
Ali Adravi

Nachdem ich mehr als eine Stunde lang keine Ergebnisse erhalten hatte, versuchte ich einen anderen Ansatz, keine Migrationen, aber ich habe einen Schemavergleich durchgeführt.

In Visual Studio -> Extras -> SQL Server -> Neuer Schemavergleich

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

0
FrankyHollywood

In meinem Fall (zurücksetzen und eine neue Datenbank erhalten wollen),

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

und ich habe vorhin gesehen:

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

Meine Datenbank wurde erstellt, aber kein Eintrag im Migrationsverlauf.

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

MigrationsHistory war leer.

dotnet ef database update -c StudyContext --verbose ausführen

(--verbose nur zum Spaß)

und bekam Done.

0
JohnFI

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

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

wie in - https://docs.Microsoft.com/de-de/ef/core/managing-schemas/migrations/#create-a-migration

Wenn Sie versucht haben, Ihre Datenbank durch Löschen der Datei migration.cs manuell neu zu erstellen, müssen Sie darauf achten, dass die Datei Migrations/* ContextModelSnapshot.cs noch vorhanden ist.

Andernfalls haben Ihre nachfolgenden Migrationen keine Momentaufnahme, auf der die erforderlichen Unterschiede erstellt werden können, und Ihre neuen Migrationsdateien werden so aussehen, als würden sie alles von Grund auf neu erstellen. Sie erhalten dann den oben stehenden Tabellenfehler.

0
WickedW

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

0
Rasto