EF 迁移 - 数据库中已有一个名为“”的对象

Posted

技术标签:

【中文标题】EF 迁移 - 数据库中已有一个名为“”的对象【英文标题】:EF Migrations - There is already an object named '' in the database 【发布时间】:2016-11-03 18:17:18 【问题描述】:

我在向我的数据库添加新表时遇到问题。这些是我在尝试添加新迁移时输入的命令:

Add-Migration AdminSett

脚手架迁移“AdminSett”。为此的设计器代码 迁移文件包含当前 Code First 模型的快照。 此快照用于计算模型的更改,当您 脚手架下一次迁移。如果您对您的 您想要包含在此迁移中的模型,那么您可以 通过再次运行“Add-Migration AdminSett”重新搭建它。

Update-Database AdminSett

指定“-Verbose”标志以查看正在应用的 SQL 语句 到目标数据库。应用显式迁移: [201607011035464_AdminSett]。应用显式迁移: 201607011035464_AdminSett。 System.Data.SqlClient.SqlException (0x80131904): 已经有一个名为“AdminSettings”的对象 数据库。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名,布尔异步,Int32 超时,布尔异步写入)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 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, DbCommandInterceptionContext1 c) 在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3 操作,TInterceptionContext 拦截上下文, Action3 executing, Action3 执行)在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand 命令,DbCommandInterceptionContext 拦截上下文)在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() 在 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement、DbConnection 连接、DbTransaction 事务,DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement、DbConnection 连接、DbTransaction 事务,DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable1 migrationStatements、DbTransaction 事务、DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements、DbConnection 连接、DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 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](Func1 操作)在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(操作 操作)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements, DbTransaction existingTransaction) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable1 操作, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId) 在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId) 在 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 目标迁移)在 System.Data.Entity.Migrations.DbMigrator.c__DisplayClassc.b__b() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.DbMigrator.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner 亚军)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布尔力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand.c__DisplayClass2.<.ctor>b__0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作 命令)ClientConnectionId:dec63212-4546-48a9-bf8e-9e2b8548fcf3 错误 Number:2714,State:6,Class:16 已经有一个对象名为 数据库中的“AdminSettings”。

同样在数据库的 _Migrations 表中,我没有用于迁移的行,名称为:AdminSett

【问题讨论】:

看起来你已经有了一个AdminSettings 表... 那么,表AdminSettings 是如何进入数据库的呢? 数据库中只有一个名为 AdminSettings 的表,它是我刚刚创建的,所以我不知道为什么会这样说 您手动创建的?使用 SQL 语句? 是的,我创建了表,创建了类,然后创建了 DBset,然后我运行了迁移,我收到了这个错误 但是迁移是创建表的东西,它推断它应该通过查看您的数据模型并将其与 _migrations 表中的数据进行比较,而不是与您的数据库的实际架构进行比较.如果您手动创建了表,那么您现在拥有的架构与 _migrations 中的数据不同......所以迁移当然会失败。要么通过迁移进行所有架构修改,要么什么都不做。如果您一直在玩弄数据库,EF 无法猜测该怎么做。 【参考方案1】:

当我试图弄清楚为什么我的在线 azure 数据库不接受我抱怨同样问题的更新命令时,我偶然发现了这个问题。

在检查 _EFMigrationHistory 表时,我发现在线数据库缺少几个迁移条目,这些条目已经发生在在线数据库中(不知道为什么会这样,可能是我将数据包上传到了数据库中并且不包括_EFMigrationHistory 表?)。

无论如何,我通过将所有相关迁移从 myu 本地复制到在线数据库来解决问题,以便 EF 知道它应该从哪个迁移开始运行。

【讨论】:

【参考方案2】:

数据库中有一个名为Admin Setting的表,你应该手动从数据库中删除它,然后运行update-database命令来更新数据库。

【讨论】:

以上是关于EF 迁移 - 数据库中已有一个名为“”的对象的主要内容,如果未能解决你的问题,请参考以下文章

ef6 code first,对已有数据库如何执行迁移

EF数据迁移命令

添加新迁移时,EF 数据迁移不会检测到更改

EF CodeFirst 命令步骤

在EF代码中使用View首先与迁移冲突

EF应用一:Code First模式