C’è già un object chiamato nel database

Aggiornamento del database non riuscito dalla console di Gestione pacchetti. Ho usato Entity Framework 6.x e approccio code-first. L’errore è

“C’è già un object chiamato ‘AboutUs’ nel database.”

Come posso risolvere questo problema?

internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = false; } protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context) { } } 

Il mio DbContext è:

 public class JahanBlogDbContext : IdentityDbContext { public JahanBlogDbContext() : base("name=JahanBlogDbConnectionString") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); modelBuilder.Entity().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true); base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("User"); modelBuilder.Entity().ToTable("Role"); modelBuilder.Entity().ToTable("UserRole"); modelBuilder.Entity().ToTable("UserLogin"); modelBuilder.Entity().ToTable("UserClaim"); } public virtual DbSet
Articles { get; set; } public virtual DbSet ArticleLikes { get; set; } public virtual DbSet ArticleTags { get; set; } public virtual DbSet AttachmentFiles { get; set; } public virtual DbSet Comments { get; set; } public virtual DbSet CommentLikes { get; set; } public virtual DbSet CommentReplies { get; set; } public virtual DbSet ContactUs { get; set; } public virtual DbSet Projects { get; set; } public virtual DbSet ProjectStates { get; set; } public virtual DbSet ProjectTags { get; set; } public virtual DbSet Ratings { get; set; } public virtual DbSet Tags { get; set; } public virtual DbSet AboutUs { get; set; } }

Console di gestione dei pacchetti:

 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.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.b__2e() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.c__DisplayClass1.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.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.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> 

sembra che ci sia un problema nel processo di migrazione, eseguire il comando add-migration in “Package Manager Console”:

Add-Migration Initial -IgnoreChanges

apportare alcune modifiche e quindi aggiornare il database dal file “Iniziale”:

Update-Database -verbose

Modifica: -IgnoreChanges è in EF6 ma non in EF Core, ecco una soluzione: https://stackoverflow.com/a/43687656/495455

Forse hai cambiato lo spazio dei nomi nel tuo progetto!
C’è una tabella nel tuo database chiamata dbo.__MigrationHistory . La tabella ha una colonna chiamata ContextKey .
Il valore di questa colonna è basato sul tuo namespace . per esempio è ” DataAccess.Migrations.Configuration “.
Quando si modifica lo spazio dei nomi, vengono generati nomi di tabelle duplicati con spazi dei nomi diversi.
Quindi, dopo aver cambiato spazio dei nomi nel codice, cambia anche lo spazio dei nomi in questa tabella nel database (per tutte le righe).
Ad esempio, se si modifica lo spazio dei nomi in EFDataAccess , è necessario modificare i valori della colonna ContextKey in dbo.__MigrationHistory in ” EFDataAccess.Migrations.Configuration “.
Quindi, nel lato del codice, in Strumenti => Console Gestione pacchetti, utilizzare il comando update-database .

Un’altra opzione invece di modificare il valore di contesto nel database consiste nel codificare in modo rigido il valore di contesto nel codice con il valore del vecchio spazio dei nomi. Ciò è ansible ereditando DbMigrationsConfiguration e nel costruttore basta assegnare il vecchio valore di contesto a ContextKey , che ereditare da MigrateDatabaseToLatestVersion e lasciare la class vuota. L’ultima cosa da fare è chiamare Database.SetInitializer(new YourDbInitializer()); nel tuo DbContext in un costruttore statico.

Spero che il problema verrà risolto.

“C’è già un object chiamato ‘AboutUs’ nel database.”

Questa eccezione ti dice che qualcuno ha già aggiunto un object chiamato “AboutUs” al database.

AutomaticMigrationsEnabled = true; può portare ad esso poiché le versioni di base dati non sono controllate da te in questo caso. Per evitare migrazioni imprevedibili e accertarsi che tutti gli sviluppatori del team lavorino con la stessa struttura di base di dati, suggerisco di impostare AutomaticMigrationsEnabled = false; .

Le migrazioni automatiche e le migrazioni codificate possono coesistere se si è molto attenti e l’unico sviluppatore di un progetto.

C’è una citazione dal post di Automatic Code First Migrations sul Data Developer Center :

Migrazioni automatiche consente di utilizzare Code First Migrations senza avere un file di codice nel progetto per ogni modifica apportata. Non tutte le modifiche possono essere applicate automaticamente, ad esempio la rinomina di una colonna richiede l’utilizzo di una migrazione basata su codice.

Raccomandazione per gli ambienti del team

È ansible suddividere le migrazioni automatiche e basate su codice, ma ciò non è consigliato negli scenari di sviluppo del team. Se fai parte di un gruppo di sviluppatori che usano il controllo del codice sorgente, devi utilizzare migrazioni puramente automatiche o migrazioni basate esclusivamente su codice. Dati i limiti delle migrazioni automatiche, si consiglia di utilizzare le migrazioni basate su codice negli ambienti di team.

Assicurati che il progetto di avvio delle tue soluzioni abbia la connessione corretta nel file di configurazione. Oppure impostare il parametro -StartUpProjectName durante l’esecuzione del comando update-database. Il parametro -StartUpProjectName consente di specificare il file di configurazione da utilizzare per le stringhe di connessione denominate. Se omesso, viene utilizzato il file di configurazione del progetto specificato.

Ecco un link per i comandi di comando ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/

Nel mio caso avevo ribattezzato l’assembly che conteneva il modello di framework di quadro code-first. Sebbene lo schema effettivo non sia stato modificato in tutte le tabelle delle migrazioni chiamate

 dbo.__MigrationHistory 

contiene un elenco di migrazioni già eseguite in base al vecchio nome dell’assembly. Ho aggiornato il vecchio nome nella tabella delle migrazioni per abbinarlo al nuovo e la migrazione ha funzionato di nuovo.

Nel mio caso, il mio tavolo EFMigrationsHistory stato svuotato (in qualche modo) e nel tentativo di eseguire update-database avrei ottenuto:

C’è già un object chiamato ‘AspNetUsers’ nel database

Dopo aver visto il tavolo era stato svuotato, aveva senso che cercasse di rieseguire la migrazione iniziale e provare a ricreare le tabelle.

Per risolvere questo problema ho aggiunto delle righe alla mia tabella EFMigrationsHistory . 1 riga per ogni migrazione che sapevo che il database era aggiornato con.

Una riga avrà 2 colonne: MigrationId e ProductVersion

MigrationId è il nome del tuo file di migrazione. Esempio: 20170628112345_Initial

ProductVersion è la versione ef che stai utilizzando. Puoi trovarlo digitando Get-Package nella Console di Gestione pacchetti e cercando il tuo pacchetto ef.

Spero che questo sia utile per qualcuno.

Nota: soluzione non raccomandata. ma soluzione rapida in alcuni casi.

Per me, dbo._MigrationHistory nel database di produzione ha mancato i record di migrazione durante il processo di pubblicazione, ma il database di sviluppo aveva tutti i record di migrazione.

Se si è certi che db di produzione abbia lo stesso e il più recente schema rispetto a dev db, copiare tutti i record di migrazione in db di produzione può risolvere il problema.

Puoi farlo solo in VisualStudio.

  1. Aprire il pannello ‘Esplora oggetti SQL Server’> fare clic con il tasto destro del mouse dbo._MigrationHistory tabella dbo._MigrationHistory nel dbo._MigrationHistory di origine (nel mio caso dev db)> Fare clic sul menu “Confronto dati …”.
  2. Quindi, la procedura guidata Confronto dati è stata visualizzata, selezionare il database di destinazione (nel mio caso db produzione) e fare clic su Avanti.
  3. Pochi secondi dopo, mostrerà alcuni record solo nel database di origine. fai semplicemente clic sul pulsante ‘Aggiorna target’.
  4. Nel browser, premi il pulsante di aggiornamento e vedi il messaggio di errore sparito.

Si noti che, di nuovo, non è raccomandato in progetti complessi e seri. Usa questo solo tu hai problemi durante l’apprendimento di ASP.Net o di EntityFramework.

Nel mio caso, il problema era in Seeder. Stavo chiamando _ctx.Database.EnsureCreated () al suo interno e per quanto ho capito, il comando del database di aggiornamento è stato eseguito correttamente, ma poi la seminatrice ha provato a creare il database “secondo”.

Come indirizzare:

  1. Aggiorna la corsa, avvia l’applicazione e chiama ConfirmCreated (). Il database sarà creato / aggiornato
  2. Commenta o rimuovi la seminatrice.

Elimina le righe dalla tabella dbo_MigrationHistory o elimina la tabella ed esegui

 update-database -verbose 

Effettuerà tutte le migrazioni nel progetto una per una

Basta eseguire il comando update-migration -Script. Questo genera un nuovo script * .sql che include tutte le modifiche ai DB incluse nella migrazione. Alla fine del codice ci sono comandi di inserimento di questo tipo: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) puoi semplicemente eseguire tutto questo INSERT e il DB sarà sincronizzato

Nel file di migrazione, controlla il metodo Up () di override pubblico . Potresti provare a creare un nuovo object db che è già presente nel database. Quindi, è necessario rilasciare questo object / tabella prima della creazione dell’object db. Basta fare come muggito-

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

E ora esegui la tua migrazione Update-Database -TargetMigration: "2016_YourMigration"