database - update - Ya hay un objeto nombrado en la base de datos.
remove migration entity framework core (18)
La base de datos de actualización falló desde la consola de Package Manager 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 gestió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>
"Ya hay un objeto llamado ''AboutUs'' en la base de datos".
Esta excepción le dice que alguien ya ha agregado un objeto llamado ''AboutUs'' a la base de datos.
AutomaticMigrationsEnabled = true;
puede conducir a esto ya que las versiones de la base de datos no están controladas por usted en este caso.
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 configure
AutomaticMigrationsEnabled = false;
.
Las migraciones automáticas y las migraciones codificadas pueden convivir si eres muy cuidadoso y eres el único desarrollador en un proyecto.
Hay una cita de la publicación Automatic Code First Migrations en el Centro de desarrollo de datos :
Las migraciones automáticas le permiten usar 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 columna 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 utiliza el control de código fuente, debe 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.
¡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, genera nombres de tabla duplicados con diferentes espacios de nombres.
Entonces, después de cambiar el espacio de nombres en el lado del código, cambie también 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 columna
ContextKey
en
dbo.__MigrationHistory
a "
EFDataAccess.Migrations.Configuration
".
Luego, en el lado del código, en Herramientas => Package Manager Console, use el comando
update-database
.
Otra opción en lugar de cambiar el valor de contexto en la base de datos es codificar el valor de contexto en su código al antiguo valor del espacio de nombres.
Esto es posible heredando
DbMigrationsConfiguration<YourDbContext>
y en el constructor simplemente asigne el valor de contexto anterior a
ContextKey
, que herede de
MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
y deje esa clase vacía.
Lo último que debe hacer es llamar a
Database.SetInitializer(new YourDbInitializer());
en su DbContext en un constructor estático.
Espero que se solucione su problema.
¿Ha eliminado la carpeta de migración que está intentando ejecutar el comando "actualizar base de datos" en la consola del administrador de paquetes? si es así
Simplemente elimine manualmente todas sus tablas. Luego, ejecute if update-databse (se eliminarán los datos iniciales de contras)
Asegúrese de que su proyecto de inicio de soluciones tenga la cadena de conexiones correcta en el archivo de configuración. O establezca el parámetro -StartUpProjectName cuando ejecute el comando update-database. El parámetro -StartUpProjectName especifica el archivo de configuración que se usará 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 referencias de comandos de ef-migración http://coding.abel.nu/2012/03/ef-migrations-command-reference/
Después de más de una hora de no obtener ningún resultado, probé otro enfoque, no utilicé 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 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.
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
En el archivo de migración, verifique el método de anulación pública void Up () . Puede que esté intentando crear un nuevo objeto db que ya está en la base de datos. Por lo tanto, debe soltar este objeto / tabla antes de crear el objeto db. Solo haz como abajo
DropTable("dbo.ABC");
CreateTable(
"dbo.ABC",
c => new
{
Id = c.Int(nullable: false, identity: true),
..
}
Y ahora ejecute su migración
Update-Database -TargetMigration: "2016_YourMigration"
En mi caso (quiero restablecer y obtener una nueva base de datos),
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"
Mi base de datos fue creada, pero no hay registro en el historial de migraciones.
Dejo caer todas las tablas excepto dbo .__ MigrationsHistory
MigrationsHistory estaba vacío.
Ejecute la
dotnet ef database update -c StudyContext --verbose
(--verbose solo por diversión)
y se
Done.
En mi caso, cambié 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 migraciones ya realizadas en función del nombre del ensamblado anterior. Actualicé el nombre anterior en la tabla de migraciones para que coincida con el nuevo y la migración funcionó nuevamente.
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 ejecutó con éxito, pero luego la sembradora intentó crear la base de datos "por segunda vez".
Cómo abordar:
- Realice la actualización de la ejecución de la tuerca, simplemente inicie la aplicación y llame a GuaranteeCreated (). La base de datos será creada / actualizada
- Comente o elimine la sembradora.
En mi caso, mi tabla
EFMigrationsHistory
se vació (de alguna manera) y al intentar ejecutar
update-database
obtendría:
Ya hay 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 e intentara recrear las tablas.
Para solucionar este problema, agregué filas en mi tabla
EFMigrationsHistory
.
1 fila por cada migración con la que sabía que la base de datos estaba actualizada.
Una fila tendrá 2 columnas:
MigrationId
y
ProductVersion
MigrationId
es el nombre de su archivo de migración.
Ejemplo:
20170628112345_Initial
ProductVersion
es la versión ef que está ejecutando.
Puede encontrar esto escribiendo
Get-Package
en Package Manager Console y buscando su paquete ef.
Espero que esto sea útil para alguien.
Lo mismo ocurrió conmigo. El problema fue que en realidad
MoviesCast
mi tabla de base de datos
MoviesCast
e hice una nueva tabla y el problema fue que mi última migración estaba tratando de inducir la tabla eliminada
MoviesCast
en 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
Me enfrenté al mismo error que a continuación. Luego lo arreglé de la siguiente manera:
-
Verifique las bases de datos actuales en su proyecto:
-
dotnet ef migrations list
-
-
Si lo más nuevo es lo que ha agregado, elimínelo:
-
dotnet ef migrations remove
-
- 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.
Intente volver a agregar:
dotnet ef migrations add [new_dbo_name]
5. Finalmente, intente actualizar nuevamente, en base a 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 útil. ^^
Nota: solución no recomendada. pero solución rápida en algunos casos.
Para mí,
dbo._MigrationHistory
en la base de datos de producción perdió 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 producción db tiene el mismo esquema y el más nuevo en comparación con dev db, copiar todos los registros de migración a la producción db podría resolver el problema.
Puedes hacerlo únicamente con VisualStudio.
-
Abra el panel ''SQL Server Object Explorer''> haga clic con el botón
dbo._MigrationHistory
en la tabladbo._MigrationHistory
en la base de datos de origen (en mi caso dev db)> Haga clic en el menú "Comparación de datos ...". - Luego, apareció el asistente de comparación de datos, seleccione la base de datos de destino (en mi caso, db de producción) y haga clic en Siguiente.
- 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''.
- En el navegador, presione el botón de actualización y verá el mensaje de error desaparecido.
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.
Otro escenario extremo de EF Core.
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 recrear manualmente su base de datos eliminando los archivos migration.cs, tenga cuidado de que su archivo Migrations / * ContextModelSnapshot.cs todavía 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 de nuevo desde cero, entonces obtendrá el error de tabla existente como se indicó anteriormente.
Simplemente ejecute el comando actualización-migración -Script. Esto genera un nuevo script * .sql que incluye todos los cambios de 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 esto todo INSERT y DB se sincronizarán
Tuve el mismo problema y después de tres horas de lucha descubro qué está pasando
En mi caso, cuando quería migrar por primera vez en
up()
método
up()
, el código predeterminado quiere crear las tablas que ya existían, así que obtuve el mismo error que usted
Para resolverlo, simplemente elimine esos códigos y escriba lo que quiera. Por ejemplo, quería agregar una columna, así que solo escribo
migrationBuilder.AddColumn<string>(
name: "fieldName",
table: "tableName",
nullable: true);
parece que hay un problema en el proceso de migración, ejecute el comando add-migración en "Package Manager Console":
Add-Migration Initial -IgnoreChanges
realice algunos cambios y luego actualice la base de datos desde el archivo "Inicial":
Update-Database -verbose
Editar: -IgnoreChanges está en EF6 pero no en EF Core, aquí hay una solución alternativa: https://.com/a/43687656/495455