运行Update-Database -Verbose
时出现以下错误:
使用StartUp项目'WebApplication'。使用NuGet项目 'Web应用程序'。指定'-Verbose'标志以查看SQL 语句被应用于目标数据库。目标数据库是: 'Frappuccino'(DataSource:(Localdb)\ v11.0,提供者: System.Data.SqlClient,Origin:Configuration)。没有未决的明确 迁移。应用自动迁移: 201402032027563_AutomaticMigration。 ALTER TABLE [dbo]。[客户] ALTER COLUMN [ID] [int] NOT NULL System.Data.SqlClient.SqlException (0x80131904):对象'PK_dbo.Clients'依赖于列'ID'。 对象'FK_dbo.Users_dbo.Clients_Client_ID'取决于列 'ID'。 ALTER TABLE ALTER COLUMN ID因一个或多个对象而失败 访问此列。在 System.Data.SqlClient.SqlConnection.OnError(SqlException异常, 布尔值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,布尔& dataReady)at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 methodName,Boolean async,Int32 timeout,Boolean asyncWrite)at 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.InternalDispatcher
1.Dispatch [TInterceptionContext,TResult](Func键1 operation, TInterceptionContext interceptionContext, Action
1 执行,行动1 executed) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
1 migrationStatements,DbConnection连接)at System.Data.Entity.Migrations.DbMigrator<> C_ DisplayClass32.b _2e() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy<> C_ DisplayClass1.b _0() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func键
at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable
1 migrationStatements)at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
1个操作, IEnumerable的1 systemOperations, Boolean downgrading, Boolean auto)
1 pendingMigrations,String targetMigrationId,String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable
在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) System.Data.Entity.Migrations.DbMigrator<> C_ DisplayClassc.b _b() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(动作 mustSucceedToKeepDatabase)at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(动作 mustSucceedToKeepDatabase)at System.Data.Entity.Migrations.DbMigrator.Update(字符串 targetMigration) System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 targetMigration) System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner) 跑者) System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,Boolean force)at System.Data.Entity.Migrations.UpdateDatabaseCommand<> C_ DisplayClass2< .ctor&GT,B _0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(动作 命令)ClientConnectionId:9854ba62-772c-4ba6-b185-ecae993e065f 对象'PK_dbo.Clients'依赖于列'ID'。物体 'FK_dbo.Users_dbo.Clients_Client_ID'取决于列'ID'。 ALTER TABLE ALTER COLUMN ID失败,因为一个或多个对象访问 这一栏。
在此之前我要做的是将{{1>}变量从我的代码优先模型类从ID
更改为Int16
。
请帮忙吗?
答案 0 :(得分:8)
看起来数据库无法更改/删除ID列,因为另一个表具有引用ID列的外键。如果你删除引用,更新列,然后重新添加引用,你应该好好去...
答案 1 :(得分:6)
问题已解决:删除所有与迁移相关的文件夹,文件和表格后,我重新启用迁移并按照您的说法重新填充数据库
根据已接受的答案,以下是解决问题的具体步骤,而不会删除所有迁移或手动编辑迁移。
在我的情况下,我有
public class Parent
{
public virtual ICollection<Child> A { get; set; }
}
必须将孩子的类型从Child更改为OtherChild。那是我遇到错误的时候。
为了解决这个问题,我创建了两个迁移。第一个从EF中取消映射属性A.我本可以对它进行评论,但访问该属性的相当多的代码将无法编译。
public class Parent
{
[NotMapped]
public virtual ICollection<Child> A { get; set; }
}
添加迁移UnmapA
更新的数据库
然后我重新映射了属性并更改了类型
public class Parent
{
public virtual ICollection<OtherChild> A { get; set; }
}
add-migration ChangeChildType
更新的数据库