首页 新闻 会员 周边

用Migrations使用EF的CodeFrist

0
悬赏园豆:50 [已解决问题] 解决于 2015-08-17 11:30

使用程序包窗口执行enable-migrations时出现以下错误,

enable-migrations
enable-migrations : 无法将“enable-migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ enable-migrations
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (enable-migrations:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException。

有谁遇到过。

Frank_Zheng的主页 Frank_Zheng | 初学一级 | 园豆:41
提问于:2015-08-02 22:41
< >
分享
最佳答案
0

你是在DbContext所在的项目中执行enable-migrations的吗?

收获园豆:50
dudu | 高人七级 |园豆:31003 | 2015-08-03 10:23

是的

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 11:51

@Frank_Zheng: 重新编译一下项目,再试试

dudu | 园豆:31003 (高人七级) | 2015-08-03 11:56

@dudu: 试过了,没什么用

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 11:57

@Frank_Zheng: EF的版本是多少?

dudu | 园豆:31003 (高人七级) | 2015-08-03 11:58

@dudu: 6.1.3

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 12:00

@Frank_Zheng: 再确认一下,执行enable-migrations时,Package Manager Console中Default project是DbContext所在的项目吗?

dudu | 园豆:31003 (高人七级) | 2015-08-03 12:15

@dudu: 发现原因了,是nuget版本太低了。

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 12:17

@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 | 园豆:41 (初学一级) | 2015-08-03 12:19

@Frank_Zheng: OrderId是主键,需要先删除FK_dbo.RMAs_dbo.Orders_OrderId。可以手动修改 Update.Down() 方法

dudu | 园豆:31003 (高人七级) | 2015-08-03 12:29

@dudu: 能说清楚点吗,是先把数据库中的FK_dbo.RMAs_dbo.Orders_OrderId这个键删了,然后再修改Update.Down()方法吗,  Update.Down() 这个方法是什么东西

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 12:33

@Frank_Zheng: 如果直接从数据库中删除FK_dbo.RMAs_dbo.Orders_OrderId,就不需要改Down方法了。

dudu | 园豆:31003 (高人七级) | 2015-08-03 12:42

@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 | 园豆:41 (初学一级) | 2015-08-03 14:17

@Frank_Zheng: 估计问题出在

RenameColumn(table: "dbo.RMAs", name: "OrderId", newName: "Order_Id");

建议先删除OrderId,再添加Order_Id,不要直接改名。

dudu | 园豆:31003 (高人七级) | 2015-08-03 14:28

@dudu: 怎么个删除法

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 14:29

@Frank_Zheng: 怎么有这2行代码:

AddColumn("dbo.RMAs", "OrderId", c => c.Int(nullable: false));
//...
CreateIndex("dbo.RMAs", "OrderId");

建议先把它删除试试

dudu | 园豆:31003 (高人七级) | 2015-08-03 14:34

@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 | 园豆:41 (初学一级) | 2015-08-03 14:38

@Frank_Zheng: 这个操作对应的应该是:

RenameColumn(table: "dbo.RMAs", name: "OrderId", newName: "Order_Id");
dudu | 园豆:31003 (高人七级) | 2015-08-03 14:41

@dudu: 恩,这句话应该怎么改

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 14:43

@Frank_Zheng: 你可以删除实体的OrderId,然后添加Order_Id,然后migration会帮你生成

dudu | 园豆:31003 (高人七级) | 2015-08-03 14:46

@dudu: 弄了后还是没用。。。

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 14:50

@Frank_Zheng: 你要把之前生成的update代码删除。

dudu | 园豆:31003 (高人七级) | 2015-08-03 14:56

@dudu: 现在提示 由于表 'RMAs' 中不存在列 'Order_Id',ALTER TABLE DROP COLUMN 失败。

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 15:00

@Frank_Zheng: 如果方便的话,弄个示例项目,发给我,我自己在电脑上试一下。

dudu | 园豆:31003 (高人七级) | 2015-08-03 15:04

@dudu: VS2013的行吗

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-03 15:14

@Frank_Zheng: 行

dudu | 园豆:31003 (高人七级) | 2015-08-03 15:21

@dudu: 不好意思,东西在多复杂不出来,不过东西都弄好了,谢谢你耐心的帮助

Frank_Zheng | 园豆:41 (初学一级) | 2015-08-17 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册