EF代码首次迁移

时间:2013-08-22 14:55:53

标签: entity-relationship ef-migrations

我已按照以下步骤使用代码优先方法创建数据库。

  1. 创建课程
  2. 启动包管理器
  3. 启用 - 迁移--ContextTypeName -MyDb
  4. 在Model类中进行了更改
  5. 执行'Update-Database -Verbose'
  6. 更改已反映在数据库表
  7. 现在我连接到数据库并删除表。当我执行'Update-Database -Verbose'命令时,我的期望是它会再次创建表,但它失败并显示以下错误消息。

        PM> Update-Database -Force
    Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
    No pending code-based migrations.
    Applying automatic migration: 201308221453295_AutomaticMigration.
    System.Data.SqlClient.SqlException (0x80131904): Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.
       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)
       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.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.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, Boolean downgrading, Boolean auto)
       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`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.Update(String targetMigration)
       at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
       at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
       at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
    ClientConnectionId:d07c8463-88f6-44fa-a242-fe0da2c36f31
    Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.
    
    Can anyone help?  How can I create table again using code first approach?
    

    此致 Hemant Shelar

1 个答案:

答案 0 :(得分:0)

数据库中有一个包含所有运行迁移的系统表,因此重新运行Update-Database不应执行任何操作。除非您在项目中更改了导致自动迁移的模型,否则您尚未明确创建迁移,并且实体框架正在尝试将数据库与模型匹配。

正如Raphaël所说,它的代码是第一位的。如果要先通过代码管理表,则不应直接修改表。如果您确实想这样做,则需要从__MigrationHistory系统表中删除迁移,以便Entity Framework不认为迁移已运行。或者使用Update-Database -Target:[migration target here]通过命令行开关降级/恢复数据库。