使用程序包窗口执行enable-migrations时出现以下错误,
enable-migrations
enable-migrations : 无法将“enable-migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ enable-migrations
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (enable-migrations:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException。
有谁遇到过。
你是在DbContext所在的项目中执行enable-migrations的吗?
是的
@Frank_Zheng: 重新编译一下项目,再试试
@dudu: 试过了,没什么用
@Frank_Zheng: EF的版本是多少?
@dudu: 6.1.3
@Frank_Zheng: 再确认一下,执行enable-migrations时,Package Manager Console中Default project是DbContext所在的项目吗?
@dudu: 发现原因了,是nuget版本太低了。
@dudu: 不过更新数据库时又出错了。
update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201508030220276_UpdataDatabasesWithAddRe].
Applying explicit migration: 201508030220276_UpdataDatabasesWithAddRe.
System.Data.SqlClient.SqlException (0x80131904): 对象'FK_dbo.RMAs_dbo.Orders_OrderId' 依赖于 列'OrderId'。
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN OrderId 失败。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
在 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
在 System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
在 System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
在 System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
在 System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
在 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.<Update>b__b()
在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
在 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
在 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 runner)
在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
在 System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:4a7ce4d7-01ea-4eba-a8c9-f31edc0b2fed
对象'FK_dbo.RMAs_dbo.Orders_OrderId' 依赖于 列'OrderId'。
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN OrderId 失败。
这又是什么原因
@Frank_Zheng: OrderId是主键,需要先删除FK_dbo.RMAs_dbo.Orders_OrderId。可以手动修改 Update.Down() 方法
@dudu: 能说清楚点吗,是先把数据库中的FK_dbo.RMAs_dbo.Orders_OrderId这个键删了,然后再修改Update.Down()方法吗, Update.Down() 这个方法是什么东西
@Frank_Zheng: 如果直接从数据库中删除FK_dbo.RMAs_dbo.Orders_OrderId,就不需要改Down方法了。
@dudu:
DropForeignKey("dbo.RMAs", "OrderId", "dbo.Orders");
DropIndex("dbo.RMAs", new[] { "OrderId" });
AlterColumn("dbo.RMAs", "OrderId", c => c.Int());
AlterColumn("dbo.Senders", "SenderCountry", c => c.String(maxLength: 64));
AlterColumn("dbo.Senders", "SenderState", c => c.String(maxLength: 64));
AlterColumn("dbo.Orders", "CustomerCountry", c => c.String(maxLength: 64));
AlterColumn("dbo.Orders", "CustomerState", c => c.String(maxLength: 64));
DropColumn("dbo.RMAReceipts", "textCol");
RenameColumn(table: "dbo.RMAs", name: "OrderId", newName: "Order_Id");
AddColumn("dbo.RMAs", "OrderId", c => c.Int(nullable: false));
CreateIndex("dbo.RMAs", "Order_Id");
CreateIndex("dbo.RMAs", "OrderId");
AddForeignKey("dbo.RMAs", "Order_Id", "dbo.Orders", "Id");
Down是这个样子 要怎么改
@Frank_Zheng: 估计问题出在
RenameColumn(table: "dbo.RMAs", name: "OrderId", newName: "Order_Id");
建议先删除OrderId,再添加Order_Id,不要直接改名。
@dudu: 怎么个删除法
@Frank_Zheng: 怎么有这2行代码:
AddColumn("dbo.RMAs", "OrderId", c => c.Int(nullable: false)); //... CreateIndex("dbo.RMAs", "OrderId");
建议先把它删除试试
@dudu: 不知道,生成的。
DECLARE @var0 nvarchar(128)
SELECT @var0 = name
FROM sys.default_constraints
WHERE parent_object_id = object_id(N'dbo.RMAs')
AND col_name(parent_object_id, parent_column_id) = 'OrderId';
IF @var0 IS NOT NULL
EXECUTE('ALTER TABLE [dbo].[RMAs] DROP CONSTRAINT [' + @var0 + ']')
ALTER TABLE [dbo].[RMAs] DROP COLUMN [OrderId]
不过查看生成的SQL语句,是在这条失败的
错误:
消息 5074,级别 16,状态 1,第 1 行
索引'IX_OrderId' 依赖于 列'OrderId'。
消息 5074,级别 16,状态 1,第 1 行
对象'FK_dbo.RMAs_dbo.Orders_OrderId' 依赖于 列'OrderId'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN OrderId 失败。
@Frank_Zheng: 这个操作对应的应该是:
RenameColumn(table: "dbo.RMAs", name: "OrderId", newName: "Order_Id");
@dudu: 恩,这句话应该怎么改
@Frank_Zheng: 你可以删除实体的OrderId,然后添加Order_Id,然后migration会帮你生成
@dudu: 弄了后还是没用。。。
@Frank_Zheng: 你要把之前生成的update代码删除。
@dudu: 现在提示 由于表 'RMAs' 中不存在列 'Order_Id',ALTER TABLE DROP COLUMN 失败。
@Frank_Zheng: 如果方便的话,弄个示例项目,发给我,我自己在电脑上试一下。
@dudu: VS2013的行吗
@Frank_Zheng: 行
@dudu: 不好意思,东西在多复杂不出来,不过东西都弄好了,谢谢你耐心的帮助