Ya hay un objeto nombrado en la base de datos

115

Update-Database falló desde la consola del Administrador de paquetes. He usado Entity Framework 6.xy el enfoque de código primero. El error es

"Ya hay un objeto llamado 'AboutUs' en la base de datos".

¿Como puedó resolver esté 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)
    {

    }
}

Mi DbContext es:

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

Consola de administración de paquetes:

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> 
Dijo Roohullah Allem
fuente
¿Cómo puedo hacerlo (mapeo al diseño existente)?
Dijo Roohullah Allem
15
@HLGEM, si se puede asignar una "base de datos bien diseñada" a un modelo de objeto utilizando EF, EF también puede generarla. DB migrations es una herramienta poderosa que facilita la implementación de su base de datos. No recomendaría evitar el uso de migraciones de bases de datos. De lo contrario, se necesitan scripts de parche. Recomendaría utilizar correctamente las migraciones de DB.
Ilya Palkin

Respuestas:

129

parece que hay un problema en el proceso de migración, ejecute el comando add-migration en "Package Manager Console":

Add-Migration Initial -IgnoreChanges

haga algunos cambios y luego actualice la base de datos desde el archivo "Inicial":

Actualización-base de datos -verbose

Editar: -IgnoreChanges está en EF6 pero no en EF Core, aquí hay una solución: https://stackoverflow.com/a/43687656/495455

Sina Amirshekari
fuente
8
¿Qué hace esto exactamente? ¿Esto permite que el nuevo modelo simplemente sobrescriba el anterior?
Travis Tubbs
1
Comencé a usar migraciones manuales porque utilizo Vistas y Tablas en mi base de datos. Cometí el error de intentar utilizar migraciones automáticas y, como resultado, intentaba crear una tabla desde una vista. En este escenario, su solución no funciona, en cambio, siempre debería usar migraciones manuales. Entonces, después de hacer esto, tuve que deshacer los cambios en el control de fuente y eliminar la entrada "Inicial" de la tabla _Migrations.
arame3333
3
Esto solo me lleva a un bucle infinito: la consola del administrador de paquetes no me deja hacer Add-Migration porque da un error "No se puede generar una migración explícita porque las siguientes migraciones explícitas están pendientes ..." a saber, InitialCreate. Pero si no puedo ejecutar con éxito esa base de datos de actualización HASTA que también haya algunos cambios iniciales -IgnoreChanges, ¿qué se supone que debo hacer?
East of Nowhere
6
Agregar migración: no se puede encontrar un parámetro que coincida con el nombre del parámetro 'IgnoreChanges'.
Tzvi Gregory Kaidanov
3
@TravisTubbs esto ignora los cambios que hizo y "falsifica" que su modelo está sincronizado con la base de datos, con respecto a la tabla de migración. Aún necesita sincronizar manualmente los dos; En mi caso, eliminé los cambios realizados en el modelo, hice una migración adicional, eliminé el contenido de los métodos arriba / abajo antes de actualizar la base de datos; esto me devolvió al estado anterior a la migración de ruptura. Luego, en realidad, volví a agregar los cambios, agregué la migración y actualicé la base de datos como de costumbre, esta vez todo se sincronizó
David Refaeli
73

¡Quizás haya cambiado el espacio de nombres en su proyecto!
Hay una tabla en su base de datos llamada dbo.__MigrationHistory. La tabla tiene una columna llamada ContextKey.
El valor de esta columna se basa en su namespace. por ejemplo es " DataAccess.Migrations.Configuration".
Cuando cambia el espacio de nombres, se producen nombres de tablas duplicados con diferentes espacios de nombres.
Entonces, después de cambiar el espacio de nombres en el lado del código, también cambie el espacio de nombres en esta tabla en la base de datos (para todas las filas).
Por ejemplo, si cambia el espacio de nombres a EFDataAccess, debe cambiar los valores de la ContextKeycolumna dbo.__MigrationHistorya " EFDataAccess.Migrations.Configuration".
Luego, en el lado del código, en Herramientas => Consola del administrador de paquetes, use el update-databasecomando.

Otra opción en lugar de cambiar el valor del contexto en la base de datos es codificar el valor del contexto en su código con el valor del espacio de nombres anterior. Esto es posible heredando DbMigrationsConfiguration<YourDbContext>y en el constructor simplemente asigne el valor de contexto anterior a ContextKey, luego herede MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>y deje esa clase vacía. Lo último que debe hacer es llamar Database.SetInitializer(new YourDbInitializer());a su DbContext en un constructor estático.

Espero que se solucione su problema.

Elnaz
fuente
9
Genial, ¡tuvimos exactamente este problema!
Olivier ROMAND
3
De hecho, esta es la verdadera causa de este error. EF está intentando crear una base de datos ya que no puede leer qué migraciones se aplican a la base de datos debido a la diferencia de espacio de nombres
UfukSURMEN
Gracias esta respuesta, me ayudó mucho, como dijo Olivier ROMAND, ¡tuve exactamente este problema!
Enrique A. Pinelo Novelo
No tenía idea de que estaba relacionado con esto, pero de alguna manera incluso eliminar los registros de la MigrationHistorytabla no lo solucionó para mí ... así que dejé caer todas mis tablas y dejé que EF las creara todas de nuevo, una pequeña aplicación, no hay problema. ..pero me lo arregló.
Niklas
Esta es la respuesta correcta con detalles, también es bueno mencionar que a veces un nombre de carpeta mal escrito puede causar este problema.
H35am
17

"Ya hay un objeto llamado 'AboutUs' en la base de datos".

Esta excepción le dice que alguien ha agregado un objeto llamado 'AboutUs' a la base de datos.

AutomaticMigrationsEnabled = true;puede provocarlo, ya que en este caso usted no controla las versiones de la base de datos. Para evitar migraciones impredecibles y asegurarse de que todos los desarrolladores del equipo trabajen con la misma estructura de base de datos, le sugiero que configureAutomaticMigrationsEnabled = false; .

Las migraciones automáticas y las migraciones codificadas pueden convivir si es muy cuidadoso y es el único desarrollador en un proyecto.

Hay una cita de la publicación Automatic Code First Migrations en Data Developer Center :

Las migraciones automáticas le permiten utilizar Code First Migrations sin tener un archivo de código en su proyecto para cada cambio que realice. No todos los cambios se pueden aplicar automáticamente; por ejemplo, los cambios de nombre de las columnas requieren el uso de una migración basada en código.

Recomendación para entornos de equipo

Puede intercalar migraciones automáticas y basadas en código, pero esto no se recomienda en escenarios de desarrollo de equipos. Si forma parte de un equipo de desarrolladores que utilizan el control de código fuente, debería utilizar migraciones puramente automáticas o migraciones puramente basadas en código. Dadas las limitaciones de las migraciones automáticas, recomendamos utilizar migraciones basadas en código en entornos de equipo.

Ilya Palkin
fuente
12

En mi caso, mi EFMigrationsHistorymesa se vació (de alguna manera) y al intentar ejecutar update-databaseobtendría:

Ya existe un objeto llamado 'AspNetUsers' en la base de datos

Después de ver que la tabla se había vaciado, tenía sentido que intentara volver a ejecutar la migración inicial y tratar de recrear las tablas.

Para solucionar este problema, agregué filas a mi EFMigrationsHistorytabla. 1 fila por cada migración con la que sabía que la base de datos estaba actualizada.

Una fila tendrá 2 columnas: MigrationIdyProductVersion

MigrationIdes el nombre de su archivo de migración. Ejemplo:20170628112345_Initial

ProductVersiones la versión ef que está ejecutando. Puede encontrarlo escribiendo Get-Packageen la Consola del Administrador de paquetes y buscando su paquete ef.

Espero que esto sea útil para alguien.

Kolby
fuente
1
¿Cómo llenó la columna Modelo?
Ciaran Gallagher
7

En mi caso, había cambiado el nombre del ensamblado que contenía el modelo de marco de entidad de código primero. Aunque el esquema real no había cambiado en absoluto, la tabla de migraciones llamada

dbo.__MigrationHistory

contiene una lista de las migraciones ya realizados sobre la base de la antigua nombre de ensamblado. Actualicé el nombre anterior en la tabla de migraciones para que coincida con el nuevo y la migración funcionó nuevamente.

El senador
fuente
5

Asegúrese de que su proyecto de inicio de soluciones tenga la cadena de conexión correcta en el archivo de configuración. O establezca el parámetro -StartUpProjectName al ejecutar el comando update-database. El parámetro -StartUpProjectName especifica el archivo de configuración que se utilizará para las cadenas de conexión con nombre. Si se omite, se utiliza el archivo de configuración del proyecto especificado.

Aquí hay un enlace para las referencias del comando ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/

Ryan Layton
fuente
Esta respuesta me llevó a mi error, simplemente tenía el proyecto equivocado como proyecto de inicio.
Martin Johansson
Estaba teniendo un problema similar y esto me lo solucionó.
JordanTDN
3

Tuve el mismo problema y después de tres horas de lucha, descubro lo que está pasando.

En mi caso, cuando quise migrar por primera vez en el up()método, el código predeterminado quiere crear las tablas que ya existían, así que obtuve el mismo error que tú.

Para resolverlo, simplemente elimine ese código y escriba lo que desee. Por ejemplo, quería agregar una columna, así que solo escribo

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);
arfa
fuente
Parece una buena respuesta, pero es posible que desee revisar la ortografía. También puede utilizar fragmentos de código para dejar en claro que la última línea es código. Envíame un mensaje si quieres ayuda con esto.
Mike Poole
Gracias ¿Cómo puedo darte un masaje?
arfa
1
Bien hecho por agregar el fragmento de código @arfa. No es necesario un masaje :). Si desea enviarme un mensaje, simplemente escriba @seguido de mi nombre de usuario en la sección de comentarios.
Mike Poole
3

Nota: solución no recomendada. pero solución rápida en algunos casos.

Para mí, dbo._MigrationHistoryen la base de datos de producción se perdieron los registros de migración durante el proceso de publicación, pero la base de datos de desarrollo tenía todos los registros de migración.

Si está seguro de que la base de datos de producción tiene el mismo esquema y el más nuevo en comparación con dev db, copiar todos los registros de migración a la base de datos de producción podría resolver el problema.

Puede hacerlo con VisualStudio únicamente.

  1. Abra el panel 'Explorador de objetos de SQL Server'> haga clic con el botón derecho en la dbo._MigrationHistorytabla en la base de datos fuente (en mi caso dev db)> Haga clic en el menú "Comparación de datos ...".
  2. Luego, apareció el asistente de comparación de datos, seleccione la base de datos de destino (en mi caso, producción db) y haga clic en Siguiente.
  3. Unos segundos más tarde, mostrará algunos registros solo en la base de datos de origen. simplemente haga clic en el botón 'Actualizar destino'.
  4. En el navegador, presione el botón de actualización y verá que el mensaje de error desaparece.

Tenga en cuenta que, nuevamente, no se recomienda en proyectos complejos y serios. Use esto solo si tiene problemas durante el aprendizaje de ASP.Net o EntityFramework.

Youngjae
fuente
1
Esto funcionó para mí. Sin embargo, fue al revés. Mi base de datos de producción tenía todos los registros en __EFMigrationHistory, mientras que los de dev db faltaban de alguna manera (excepto el inicial).
Jens Mander
1

Eliminar filas de la tabla dbo_MigrationHistory o eliminar la tabla y ejecutar

update-database -verbose

Ejecutará todas las migraciones en su proyecto una por una

Ali Adravi
fuente
1

En mi caso, el problema estaba en Seeder. Estaba llamando a _ctx.Database.EnsureCreated () dentro de él y, por lo que entendí, el comando de actualización de la base de datos se ha ejecutado con éxito, pero luego seeder intentó crear la base de datos por "segunda" vez.

Cómo abordar:

  1. No ejecute la actualización, simplemente inicie la aplicación y llame a GuaranteCreated (). Se creará / actualizará la base de datos
  2. Comente o elimine la sembradora.
Chekusty
fuente
1

Otro escenario de EF Core de casos extremos.

Compruebe que tiene un archivo Migrations / YOURNAMEContextModelSnapshot.cs .

como se detalla en - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Si ha intentado volver a crear manualmente su base de datos eliminando los archivos migration.cs, tenga cuidado de que su archivo Migrations / * ContextModelSnapshot.cs aún exista.

Sin él, sus migraciones posteriores no tienen una instantánea en la que crear las diferencias requeridas y sus nuevos archivos de migraciones parecerán que están recreando todo nuevamente desde cero, luego obtendrá el error de tabla existente como se muestra arriba.

WickedW
fuente
1

Lo mismo sucedió conmigo. El problema fue que en realidad eliminé mi tabla de base de datos MoviesCaste hice una nueva tabla y el problema fue que mi última migración intentaba inducir la tabla eliminada MoviesCasten la base de datos. Lo resolví simplemente eliminando todo el contenido de la última migración y simplemente ejecuté el método Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

luego actualizó la base de datos y simplemente agregue una nueva migración

Camaleón
fuente
1

Tuve el mismo problema descrito en la respuesta que dio Elnaz. Tenía el requisito de cambiar el espacio de nombres de la capa de datos durante una refactorización de nuestro proyecto. Esto provocó que las migraciones no vieran las migraciones existentes en la base de datos. Encontré una excelente respuesta a este problema que escribió en su blog James Chambers.

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

Simplemente cambié lo siguiente en el archivo de configuración de migración.

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

Espero que esto ayude a alguien más en un aprieto.

Nathan
fuente
Tuve una situación similar después de los cambios en el espacio de nombres. Probé esta solución, pero aún no funcionó. Así que modifiqué manualmente los espacios de nombres en la tabla de la base de datos y luego comenzó a funcionar.
kosist
0

Simplemente ejecute el comando update-migration -Script. Esto genera un nuevo script * .sql que incluye todos los cambios en la base de datos incluidos en la migración. Al final del código hay comandos de inserción algo como esto: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) simplemente puede ejecutar este INSERT y DB se sincronizará

Rasto
fuente
0

Después de más de una hora sin obtener ningún resultado, probé otro enfoque, sin usar migraciones, pero hice una comparación de esquemas.

En Visual Studio -> Herramientas -> SQL Server -> Nueva comparación de esquemas

Primero creé una nueva base de datos completamente nueva con migraciones de EF. Luego hice una comparación, comparando la nueva base de datos con la que quería actualizar. Finalmente generé un script de migración y pude realizar una actualización de esquema.

FrankyHollywood
fuente
0

En mi caso (quiero restablecer y obtener una base de datos nueva),

Primero recibí el mensaje de error: There is already an object named 'TABLENAME' in the database.

y vi, un poco antes:

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

Se creó mi base de datos, pero no hay registro en el historial de migraciones.

Dejo caer todas las tablas excepto dbo .__ MigrationsHistory

MigrationsHistory estaba vacío.

correr dotnet ef database update -c StudyContext --verbose

(--verbose solo por diversión)

y consiguió Done.

JohnFI
fuente
0

Me enfrenté al mismo error que a continuación. Luego lo arreglé de la siguiente manera:

  1. Verifique las bases de datos actuales en su proyecto:
    • dotnet ef migrations list
  2. Si lo más nuevo es lo que ha agregado, elimínelo:
    • dotnet ef migrations remove
  3. Las salidas de garantía de esta base de datos deben detectarse en el código fuente: archivos .cs / .Designer.cs

4. Ahora está bien. Intenta volver a agregar: dotnet ef migrations add [new_dbo_name]

5.Finalmente, intente actualizar nuevamente, en base al arreglo en la lista de migración:

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

Espero que te sea de ayuda. ^^

Mai Nguyen
fuente
0

¿Ha eliminado la carpeta de migración que está intentando ejecutar el comando "update-database" en la consola del administrador de paquetes? si es así

Simplemente elimine manualmente todas sus tablas y luego ejecute if update-databse (se eliminarán los datos de semillas contras)

Alok Singh
fuente
0

Otra forma de hacerlo es comentar todo en la Clase Inicial, entre los Métodos Arriba y Abajo. Luego, ejecute update-database, después de ejecutar el método seed fue exitoso, así que ejecute update-database nuevamente. Tal vez sea útil para algunos amigos.

iman mohadesi
fuente
0

Estaba enfrentando el mismo problema. Intenté la siguiente solución: 1. eliminé el código de creación de tabla de Up () y el código relacionado del método Down () 2. Ejecute el comando update-database en Package Manager Consol

esto resolvió mi problema

Ashu_90
fuente
0

Nota: lo hice porque no tengo nada en mi base de datos. En mi caso: 1. Eliminé una migración mediante el comando remove-migration en la Consola del Administrador de paquetes 2. La base de datos eliminada mediante el panel 'Explorador de objetos de SQL Server'> en la base de datos actual> haga clic con el botón derecho> Eliminar 3. Migrado en la Consola del Administrador de paquetes escriba Agregar -Migración y haga clic en Enter 4. La última actualización mediante el comando update-database

Erasyl Abenov
fuente
0

Mismo caso (sin tabla DB y MigrationHistory en el servidor). Mis pasos:

  1. Eliminé los datos de migración de la sección Arriba y Abajo de mi primera migración.
  2. Actualizar la base de datos con migración vacía (se creó la tabla MigrationHistory)
  3. Agregue su migración REAL y actualice la base de datos con ella.
Vasiliy Terkin
fuente
0

En la base de datos, consulte la tabla __MigrationHistory y copie [ContextKey].

Péguelo en DbMigrationsConfiguration ConextKey como se muestra a continuación

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

Los siguientes pasos funcionaron para mí para el mismo problema:

Guión:

Estaba intentando agregar 2 campos nuevos a mi modelo existente para la funcionalidad de correo electrónico. Los nuevos campos son "IsEmailVerified" y "ActivationCode"

Pasos que he seguido:

1.Se eliminaron los archivos de migración antiguos en la carpeta "Migraciones" que me impiden hacer la base de datos de actualización 2.Revertí todos mis cambios recientes que hice en el modelo

3.Ejecute el siguiente comando:

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

4) Eliminó el contenido de los métodos Up () y Down () del archivo de migración y dejó los métodos vacíos

5.Ejecute el siguiente comando:

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

  1. Después de ejecutar el paso anterior, el modelo y la base de datos parecen sincronizados.

  2. Ahora, agregué las nuevas propiedades en el modelo.

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Ejecute el siguiente comando:

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

  1. Ahora el archivo de migración contiene solo mis cambios recientes como se muestra a continuación:

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

11.Ahora actualicé con éxito la base de datos con columnas adicionales.

La siguiente tabla es actualizada después de los cambios recientes:

Tabla después de la migración de actualización

Thamizh
fuente
Realmente no recomiendo esto, eliminar productos en migraciones solo destruirá su entorno. ¿Por qué tendría que eliminar sus migraciones si han funcionado hasta ahora? y sus cadenas de conexión no funcionarán para todos los usuarios aquí, no deberían ejecutarlas así
rakuens
-5

En el archivo de migración, verifique el método void Up () de anulación pública . Puede que esté intentando crear un nuevo objeto db que ya está en la base de datos. Por lo tanto, debe eliminar este objeto / tabla antes de la creación del objeto db. Solo haz como abajo

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

Y ahora ejecuta tu migración Update-Database -TargetMigration: "2016_YourMigration"

Mohammad Al-Hasan
fuente
6
Si hace esto, perderá todos sus datos
Mehdiway