Esiste già un oggetto denominato nel database


115

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

"Nel database è già presente un oggetto denominato" AboutUs "."

Come posso risolvere questo problema?

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

    }
}

Il mio DbContext è:

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

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

Come posso farlo (mappatura su un progetto esistente)?
Said Roohullah Allem

15
@HLGEM, Se "database ben progettato" può essere mappato a un modello a oggetti utilizzando EF, anche EF è in grado di generarlo. Le migrazioni del database sono uno strumento potente che semplifica la distribuzione del database. Non consiglierei di evitare di utilizzare le migrazioni DB. Altrimenti sono comunque necessari script di patch. Consiglierei di utilizzare correttamente le migrazioni DB.
Ilya Palkin

Risposte:


129

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

Add-Migration Initial -IgnoreChanges

fare alcune modifiche, quindi aggiornare il database dal file "Iniziale":

Update-Database -verbose

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


8
Cosa fa esattamente questo? Ciò consente al nuovo modello di sovrascrivere semplicemente il vecchio?
Travis Tubbs

1
Ho iniziato a utilizzare le migrazioni manuali perché utilizzo sia le visualizzazioni che le tabelle nel mio database. Ho commesso l'errore di provare a utilizzare le migrazioni automatiche e di conseguenza stavo cercando di creare una tabella da una vista. In questo scenario la tua soluzione non funziona, dovrei invece utilizzare sempre le migrazioni manuali. Quindi, dopo aver eseguito questa operazione, ho dovuto annullare le modifiche nel controllo del codice sorgente e rimuovere la voce "Iniziale" dalla tabella _Migrations.
arame3333

3
Questo mi conduce in un ciclo infinito: La console di Gestione pacchetti non mi consente di eseguire Add-Migration perché restituisce un errore "Impossibile generare una migrazione esplicita perché le seguenti migrazioni esplicite sono in sospeso ...", ovvero InitialCreate. Ma se non riesco a eseguire con successo quell'aggiornamento-database FINO a quando ci sono anche alcune modifiche iniziali-Ignora, allora cosa dovrei fare ??
East of Nowhere

6
Add-Migration: Impossibile trovare un parametro che corrisponde al nome del parametro "IgnoreChanges".
Tzvi Gregory Kaidanov

3
@TravisTubbs questo ignora le modifiche che hai fatto e "falsifica" che il tuo modello è sincronizzato con il db, per quanto riguarda la tabella di migrazione. È ancora necessario sincronizzare manualmente i due; Nel mio caso ho rimosso le modifiche apportate al modello, eseguito una migrazione aggiuntiva, rimosso il contenuto dai metodi su / giù prima di eseguire l'aggiornamento del database: questo mi ha riportato allo stato precedente all'interruzione della migrazione. Quindi ho effettivamente aggiunto nuovamente le modifiche, ho aggiunto la migrazione e l'aggiornamento del database come al solito - questa volta tutto è stato sincronizzato
David Refaeli,

73

Forse hai cambiato lo spazio dei nomi nel tuo progetto!
C'è una tabella nel tuo database chiamato dbo.__MigrationHistory. La tabella ha una colonna chiamata ContextKey.
Il valore di questa colonna si basa sul tuo namespace. ad esempio è " DataAccess.Migrations.Configuration".
Quando si modifica lo spazio dei nomi, vengono generati nomi di tabella duplicati con spazi dei nomi diversi.
Quindi, dopo aver modificato lo spazio dei nomi nel lato codice, modificare 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 ContextKeycolonna in dbo.__MigrationHistory" EFDataAccess.Migrations.Configuration".
Quindi, nel lato codice, in Strumenti => Console di gestione pacchetti, utilizzare il update-databasecomando.

Un'altra opzione invece di modificare il valore del contesto nel database è codificare il valore del contesto nel codice sul vecchio valore dello spazio dei nomi. Ciò è possibile ereditando DbMigrationsConfiguration<YourDbContext>e nel costruttore è sufficiente assegnare il vecchio valore di contesto a ContextKey, quindi ereditare da MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>e lasciare vuota quella classe. L'ultima cosa da fare è chiamare il Database.SetInitializer(new YourDbInitializer());tuo DbContext in un costruttore statico.

Spero che il tuo problema venga risolto.


9
Fantastico, abbiamo avuto esattamente questo problema!
Olivier ROMAND

3
In realtà questa è la vera causa di questo errore. EF sta tentando di creare un database poiché non è in grado di leggere quali migrazioni vengono applicate al database a causa della differenza
nameSpace

Grazie questa risposta, mi ha aiutato molto, come ha detto Olivier ROMAND, ho avuto esattamente questo problema!
Enrique A. Pinelo Novelo

Non avevo idea che fosse correlato a questo, ma in qualche modo anche la rimozione dei record della MigrationHistorytabella non ha risolto il problema per me ... quindi ho lasciato cadere tutte le mie tabelle e ho lasciato che EF le creasse tutte da capo, piccola app, nessun problema. ..ma l'ha risolto per me.
Niklas

Questa è la risposta corretta con i dettagli, anche bene menzionare che a volte il nome della cartella errato causerà questo problema.
H35am

17

"Nel database è già presente un oggetto denominato" AboutUs "."

Questa eccezione ti dice che qualcuno ha già aggiunto un oggetto chiamato "AboutUs" al database.

AutomaticMigrationsEnabled = true;può portare a ciò poiché le versioni del database non sono controllate da te in questo caso. Per evitare migrazioni imprevedibili e assicurarti che ogni sviluppatore del team lavori con la stessa struttura di database che ti suggerisco di impostareAutomaticMigrationsEnabled = false; .

Le migrazioni automatiche e le migrazioni codificate possono convivere se sei molto attento e l'unico sviluppatore di un progetto.

C'è una citazione dal post sulle migrazioni automatiche Code First nel Data Developer Center :

Le migrazioni automatiche consentono di utilizzare le migrazioni Code First senza avere un file di codice nel progetto per ogni modifica apportata. Non tutte le modifiche possono essere applicate automaticamente, ad esempio le ridenominazioni delle colonne richiedono l'uso di una migrazione basata su codice.

Raccomandazione per ambienti di squadra

È possibile alternare migrazioni automatiche e basate su codice, ma ciò non è consigliato negli scenari di sviluppo in team. Se fai parte di un team di sviluppatori che utilizza il controllo del codice sorgente, dovresti utilizzare migrazioni puramente automatiche o migrazioni puramente basate su codice. Dati i limiti delle migrazioni automatiche, consigliamo di utilizzare migrazioni basate su codice in ambienti di team.


12

Nel mio caso, il mio EFMigrationsHistorytavolo è stato svuotato (in qualche modo) e quando provavo a correre update-databaseottenevo:

Nel database è già presente un oggetto denominato "AspNetUsers"

Dopo aver visto che la tabella era stata svuotata, aveva senso che stesse tentando di rieseguire la migrazione iniziale e tentando di ricreare le tabelle.

Per risolvere questo problema ho aggiunto righe nella mia EFMigrationsHistorytabella. 1 riga per ogni migrazione con cui sapevo che il database era aggiornato.

Una riga avrà 2 colonne: MigrationIdeProductVersion

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

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

Spero che questo sia utile per qualcuno.


1
Come hai compilato la colonna Modello?
Ciaran Gallagher

7

Nel mio caso avevo rinominato l'assembly che conteneva il modello di framework di entità code-first. Sebbene lo schema effettivo non fosse cambiato affatto, la tabella delle migrazioni chiamata

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 in modo che corrispondesse al nuovo e la migrazione ha quindi funzionato di nuovo.


5

Assicurati che il progetto di avvio delle soluzioni abbia la stringa di connessione corretta nel file di configurazione. Oppure impostare il parametro -StartUpProjectName durante l'esecuzione del comando update-database. Il parametro -StartUpProjectName specifica 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 collegamento per i riferimenti ai comandi ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/


Questa risposta mi ha portato al mio errore, semplicemente avevo il progetto sbagliato come progetto di avvio.
Martin Johansson

Stavo avendo un problema simile e questo lo ha risolto per me.
JordanTDN

3

Ho avuto lo stesso problema e dopo tre ore di fatica scopro cosa sta succedendo

Nel mio caso, quando volevo migrare per la prima volta in up()method, il codice predefinito vuole creare le tabelle che già esistevano, quindi ho ricevuto lo stesso errore di te

Per risolverlo, elimina il codice e scrivi quello che vuoi. Ad esempio, volevo aggiungere una colonna, quindi scrivo

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

Sembra una buona risposta ma potresti voler controllare l'ortografia. Puoi anche usare frammenti di codice per chiarire che l'ultima riga è codice. Inviami un messaggio se vuoi aiuto con questo.
Mike Poole

Grazie Come posso massaggiarti
arfa

1
Complimenti per l'aggiunta dello snippet di codice @arfa. Non c'è bisogno di un massaggio :). Se desideri inviarmi un messaggio, digita @seguito dal mio nome utente nella sezione commenti.
Mike Poole

3

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

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

Se si è sicuri che il database di produzione abbia lo stesso schema più recente rispetto al database di sviluppo, la copia di tutti i record di migrazione nel database di produzione potrebbe risolvere il problema.

Puoi farlo solo con VisualStudio.

  1. Apri il pannello "Esplora oggetti di SQL Server"> fai clic con il pulsante destro del mouse sulla dbo._MigrationHistorytabella nel database di origine (nel mio caso dev db)> fai clic sul menu "Confronto dati ...".
  2. Quindi, viene visualizzata la procedura guidata di confronto dei dati, selezionare il database di destinazione (nel mio caso db di produzione) e fare clic su Avanti.
  3. Pochi secondi dopo, mostrerà alcuni record solo nel database di origine. è sufficiente fare clic sul pulsante "Aggiorna destinazione".
  4. Nel browser, premi il pulsante di aggiornamento e vedi il messaggio di errore scomparso.

Nota che, ancora una volta, non è raccomandato in progetti complessi e seri. Usa questo solo se hai problemi durante l'apprendimento di ASP.Net o EntityFramework.


1
Questo ha funzionato per me. È stato il contrario, però. Il mio db di produzione aveva tutti i record in __EFMigrationHistory, mentre quelli in dev db dovevano in qualche modo mancanti (tranne quello iniziale).
Jens Mander

1

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

update-database -verbose

Eseguirà tutte le migrazioni nel tuo progetto una per una


1

Nel mio caso, il problema era in Seeder. Stavo chiamando _ctx.Database.EnsureCreated () al suo interno e per quanto ho capito, il comando di aggiornamento del database è stato eseguito con successo, ma poi il seeder ha provato a creare il database "seconda" volta.

Come rivolgersi:

  1. Non eseguire l'aggiornamento, avvia l'applicazione e chiama GuaranteCreated (). Il database verrà creato / aggiornato
  2. Commentare o rimuovere la seminatrice.

1

Un altro scenario EF Core perimetrale.

Verifica di avere un file Migrations / YOURNAMEContextModelSnapshot.cs .

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

Se si è tentato di ricreare manualmente il database eliminando i file migration.cs, fare attenzione che il file Migrations / * ContextModelSnapshot.cs esista ancora.

Senza di esso, le tue migrazioni successive non hanno snapshot su cui creare le differenze richieste e i tuoi nuovi file di migrazioni sembreranno ricreare tutto da zero, quindi otterrai l'errore di tabella esistente come sopra.


1

lo stesso è successo con me .. Il problema era che in realtà ho cancellato la mia tabella del database MoviesCaste ho creato una nuova tabella e il problema era che la mia ultima migrazione stava cercando di indurre la tabella eliminata MoviesCastnel database. L'ho risolto semplicemente rimuovendo tutto il contenuto dell'ultima migrazione e ho semplicemente eseguito il metodo Up () e down ()

public override void Up()
{
}

public override void Down()
{
}

quindi aggiornato il database e aggiungi semplicemente una nuova migrazione


1

Ho avuto lo stesso problema descritto nella risposta che Elnaz ha dato. Avevo la necessità di modificare lo spazio dei nomi del datalayer durante un refactoring del nostro progetto. Ciò ha fatto sì che le migrazioni non vedessero le migrazioni esistenti nel database. Ho trovato un'ottima risposta a questo problema che James Chambers ha scritto nel blog.

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

Ho semplicemente modificato quanto segue nel file di configurazione della migrazione.

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

Spero che questo aiuti qualcun altro in un vicolo cieco.


Ho avuto una situazione simile dopo le modifiche allo spazio dei nomi. Ho provato questa correzione, ma non ha funzionato ancora. Quindi ho modificato manualmente gli spazi dei nomi nella tabella del database e poi ha iniziato a funzionare.
kosist

0

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


0

Dopo più di un'ora senza ottenere risultati ho provato un altro approccio, non utilizzando le migrazioni ma ho fatto un confronto dello schema.

In Visual Studio -> Strumenti -> SQL Server -> Nuovo confronto schema

Per prima cosa ho creato un nuovo database completamente nuovo con le migrazioni EF. Poi ho fatto un confronto, confrontando il nuovo database con quello che volevo aggiornare. Infine ho generato uno script di migrazione e ho potuto eseguire un aggiornamento dello schema.


0

Nel mio caso (voglio reimpostare e ottenere un nuovo database),

Per prima cosa ho ricevuto il messaggio di errore: There is already an object named 'TABLENAME' in the database.

e ho visto, poco prima:

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

Il mio database è stato creato, ma nessun record nella cronologia delle migrazioni.

Elimino tutte le tabelle tranne dbo .__ MigrationsHistory

MigrationsHistory era vuoto.

Correre dotnet ef database update -c StudyContext --verbose

(--verbose solo per divertimento)

e ottenuto Done.


0

Ho affrontato lo stesso bug come sotto. Quindi l'ho risolto come di seguito:

  1. Controlla i database correnti nel tuo progetto:
    • dotnet ef migrations list
  2. Se il più recente è quello che hai aggiunto, rimuovilo:
    • dotnet ef migrations remove
  3. Gli output di garanzia di questo database devono essere dettagliati nel codice sorgente: file .cs / .Designer.cs

4.Ora va bene. Prova ad aggiungere di nuovo: dotnet ef migrations add [new_dbo_name]

5.Infine, prova ad aggiornare di nuovo, in base alla disposizione sulla lista di migrazione:

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

Spero sia utile per te. ^^


0

Hai eliminato la cartella di migrazione rispetto a quella che stai tentando di eseguire il comando "update-database" sulla console del gestore pacchetti? se è così

Basta eliminare manualmente tutte le tabelle quindi eseguire se update-databse (i dati seed dei contro verranno eliminati)


0

Un altro modo per farlo è commentare tutto nella classe iniziale, tra i metodi Up e Down, quindi eseguire update-database, dopo che il metodo seed ha avuto successo, quindi eseguire di nuovo update-database, forse utile per alcuni amici.


0

Stavo affrontando lo stesso problema. Ho provato la seguente soluzione: 1. cancellato crea codice tabella da Up () e il codice correlato dal metodo Down () 2. Esegui il comando update-database in Package Manager Consol

questo ha risolto il mio problema


0

Nota: l'ho fatto perché non ho nulla nel mio database. Nel mio caso: 1. Ho rimosso una migrazione tramite il comando remove-migration nella Console di Gestione pacchetti 2. Database rimosso dal pannello "Esplora oggetti di SQL Server"> sul database corrente> fai clic con il pulsante destro del mouse> Rimuovi 3. Migrato nella Console di Gestione pacchetti scrivi Aggiungi -Migration e fare clic su Invio 4. L'ultimo aggiornamento tramite il comando update-database


0

Stesso caso (nessun DB e tabella MigrationHistory sul server). I miei passi:

  1. Ho eliminato i dati di migrazione dalla sezione Su e Giù della mia prima migrazione.
  2. Aggiorna database con migrazione vuota (è stata creata la tabella MigrationHistory)
  3. Aggiungi la tua VERA migrazione e aggiorna il database con essa.

0

Nel database, interrogare la tabella __MigrationHistory e copiare [ContextKey].

Incollalo in DbMigrationsConfiguration ConextKey come di seguito

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

0

I passaggi seguenti hanno funzionato per me per lo stesso problema:

Scenario:

Stavo cercando di aggiungere 2 nuovi campi al mio modello esistente per la funzionalità di posta elettronica. I nuovi campi sono "IsEmailVerified" e "ActivationCode"

Passi che ho seguito:

1.Eliminati i vecchi file di migrazione nella cartella "Migrations" che mi impedivano di eseguire Update-Database 2.Riportati tutti i miei recenti cambiamenti che ho fatto sul modello

3.Esegui il comando seguente:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Origine dati = DESKTOP \ SQLEXPRESS; Catalogo iniziale = Personalizzato; Persist Security Info = True; ID utente = sa; password = **** "

4.Eliminato il contenuto dei metodi Up () e Down () dal file di migrazione e ha lasciato i metodi vuoti

5.Esegui il comando seguente:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. Dopo aver eseguito il passaggio precedente, il modello e il DB sembrano sincronizzati.

  2. Ora ho aggiunto le nuove proprietà nel modello

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Esegui il comando seguente:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. Ora il file di migrazione contiene solo le mie modifiche recenti come di seguito:

       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. Eseguire il comando seguente: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; ID utente = sa; password = " ***

11.Ora ho aggiornato correttamente il database con colonne aggiuntive.

La tabella seguente è aggiornata dopo le recenti modifiche:

Tabella dopo la migrazione dell'aggiornamento


davvero non lo consiglio, l'eliminazione del prodotto nelle migrazioni distruggerà semplicemente i tuoi ambienti. perché dovresti eliminare le tue migrazioni se funzionassero finora? e le
tue

-5

Nel file di migrazione controlla il metodo public override void Up () . Forse stai cercando di creare un nuovo oggetto db che è già nel database. Quindi, è necessario eliminare questo oggetto / tabella prima della creazione dell'oggetto db. Basta fare come muggito-

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

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


6
Se lo fai perderai tutti i tuoi dati
Mehdiway
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.