使用Entity Framework 5和nuget重新创建表

时间:2012-11-15 06:39:54

标签: entity-framework nuget ef-migrations

我正在使用Code First创建一个表。

我创建了类,映射文件并在nuget中发出了add-migration命令,然后是update-database命令

然后我改变了课程,像一个白痴一样删掉了桌子。

我删除了迁移类文件

我发出了一个添加迁移命令

当我发出update-database命令时,出现以下错误:

  

System.Data.SqlClient.SqlException(0x80131904):找不到   对象" dbo.CorrectiveActionPlan"因为它不存在或你这样做   没有权限。在   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)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次操作,布尔值   降级,布尔自动)at   System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration   迁移,DbMigration lastMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration   迁移,DbMigration lastMigration)   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)
  在System.Data.Entity.Migrations.DbMigrator.Update(String   targetMigration)   System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串   targetMigration)   System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()   在System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()   ClientConnectionId:a6e92a35-cc9e-4867-97a5-0a274081d853找不到   对象" dbo.CorrectiveActionPlan"因为它不存在或你   没有权限。

如何强制EF重新创建表格?

3 个答案:

答案 0 :(得分:33)

我找到了答案。

我删除了[dbo]中的行。[__ MigrationHistory]对应于我的迁移

然后我删除了新的迁移文件

我重新运行了添加迁移

然后重新运行update-database -verbose

答案 1 :(得分:0)

我在代码优先迁移中保留了一些选项,它们取决于您需要删除表或删除记录的原因。这是我的方法:

  • 如果您修改了模型并且映射导致错误,导致您无法更新表,则可以使用SQL Management Server Studio&删除整个数据库。删除迁移文件夹您可能希望保存脚本以使用sql脚本重新填充测试数据或保存Configuration.cs文件,并在执行update database命令时重新填充数据。 / p>

    以下是存储过程只删除表数据的脚本示例:

    USE [DatabaseName]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[sp_DeleteAllYardPenaltyRecords]
    AS
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
    EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
    
  • 如果您只想删除数据,可以使用包管理器控制台命令:PM> Update-Database -TargetMigration $InitialDatabase&删除创建的迁移文件,即:'201502210525393_example_with_error.cs',然后重新运行'Add-Migration new_example.cs'。这会将数据库恢复为初始快照

  • 或者你可以使用你的方法:删除[dbo].[__MigrationHistory]中的行&迁移文件即:'201502210525393_example_with_error.cs'然后重新运行add-migrationupdate-database

答案 2 :(得分:-1)

您可以删除数据库然后从包管理器控制台运行'update-database'命令,所有这些都将被重新创建,包括您所做的任何更新。