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>
database
entity-framework
ef-code-first
entity-framework-6
ef-migrations
Dijo Roohullah Allem
fuente
fuente
Respuestas:
parece que hay un problema en el proceso de migración, ejecute el comando add-migration en "Package Manager Console":
haga algunos cambios y luego actualice la base de datos desde el archivo "Inicial":
Editar: -IgnoreChanges está en EF6 pero no en EF Core, aquí hay una solución: https://stackoverflow.com/a/43687656/495455
fuente
¡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 llamadaContextKey
.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 laContextKey
columnadbo.__MigrationHistory
a "EFDataAccess.Migrations.Configuration
".Luego, en el lado del código, en Herramientas => Consola del administrador de paquetes, use el
update-database
comando.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 aContextKey
, luego heredeMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
y deje esa clase vacía. Lo último que debe hacer es llamarDatabase.SetInitializer(new YourDbInitializer());
a su DbContext en un constructor estático.Espero que se solucione su problema.
fuente
MigrationHistory
tabla 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ó.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 :
fuente
En mi caso, mi
EFMigrationsHistory
mesa se vació (de alguna manera) y al intentar ejecutarupdate-database
obtendría: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
EFMigrationsHistory
tabla. 1 fila por cada migración con la que sabía que la base de datos estaba actualizada.Una fila tendrá 2 columnas:
MigrationId
yProductVersion
MigrationId
es el nombre de su archivo de migración. Ejemplo:20170628112345_Initial
ProductVersion
es la versión ef que está ejecutando. Puede encontrarlo escribiendoGet-Package
en la Consola del Administrador de paquetes y buscando su paquete ef.Espero que esto sea útil para alguien.
fuente
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
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.
fuente
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/
fuente
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
fuente
@
seguido de mi nombre de usuario en la sección de comentarios.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 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.
dbo._MigrationHistory
tabla en la base de datos fuente (en mi caso dev db)> Haga clic en el menú "Comparación de datos ...".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.
fuente
Eliminar filas de la tabla dbo_MigrationHistory o eliminar la tabla y ejecutar
Ejecutará todas las migraciones en su proyecto una por una
fuente
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:
fuente
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.
fuente
Lo mismo sucedió conmigo. El problema fue que en realidad eliminé mi tabla de base de datos
MoviesCast
e hice una nueva tabla y el problema fue que mi última migración intentaba inducir la tabla eliminadaMoviesCast
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 ()luego actualizó la base de datos y simplemente agregue una nueva migración
fuente
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.
Espero que esto ayude a alguien más en un aprieto.
fuente
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á
fuente
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.
fuente
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:
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.
fuente
Me enfrenté al mismo error que a continuación. Luego lo arreglé de la siguiente manera:
dotnet ef migrations list
dotnet ef migrations remove
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. ^^
fuente
¿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)
fuente
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.
fuente
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
fuente
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
fuente
Mismo caso (sin tabla DB y MigrationHistory en el servidor). Mis pasos:
fuente
En la base de datos, consulte la tabla __MigrationHistory y copie [ContextKey].
Péguelo en DbMigrationsConfiguration ConextKey como se muestra a continuación
fuente
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 = " ***
Después de ejecutar el paso anterior, el modelo y la base de datos parecen sincronizados.
Ahora, agregué las nuevas propiedades en el modelo.
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 = " ***
Ahora el archivo de migración contiene solo mis cambios recientes como se muestra a continuación:
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
fuente
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
Y ahora ejecuta tu migración
Update-Database -TargetMigration: "2016_YourMigration"
fuente