关于实体框架:如何重新创建我的 EF Code First Table?

How to recreate my EF CodeFirst Table?

我创建了一个 Code First 类

在Sql中自动创建了一个数据库。

我删除了表格 :(

我已启用迁移:

1
2
3
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
Database.SetInitializer(new DropCreateDatabaseAlways<SurveyContext>());

然而

1
2
3
update-database -force

Cannot find the object"dbo.CustomerResponses" because it does not exist or you do not have permissions.

请帮忙。


在系统表中有一个名为

的表

1
__MigrationHistory

...我删除了它。

在包管理器控制台中运行命令 "update-database"
问题已解决!

更多信息:

http://blog.oneunicorn.com/2012/02/27/code-first-migrations-making-__migrationhistory-not-a-system-table/


Daf De Giraf 在这里有一个更好的答案,它不会抹去你的迁移历史。

If you worked the correct way to create your migrations by using the
command Add-Migration"Name_Of_Migration" then you can do the
following to get a clean start (reset, with loss of data, of
course):

  • Update-database -TargetMigration:0
    Normally your DB is empty now since the down methods were executed.

  • Update-database
    This will recreate your DB to your current migration


  • 显然可能有更好的方法来做到这一点,但由于这是令人惊讶的顶级 Google 帐户,我认为在阅读这些答案后提及我的想法会很好:

    这是我面临的问题:
    我首先更改了由 EF6 代码生成的 FK,但遇到了错误:

    1
    Unable to determine the relationship represented by navigation property 'Account.SalaryIncomes' of type 'ICollection<Person>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

    为了解决这个错误,我尝试了许多定义映射的方法,但是我最终删除了我的 Person 表,并且在完全删除关系以尝试从头开始之后,错误得到了解决。但是,在更新数据库时,它抱怨"人"不存在 - 这导致我来到这里。

    在查看了这些答案后,我决定我懒得重新加载数据并认为迁移生成了 C# UP() 和 Down() 方法 - 我想,也许我可以参考另一个迁移...
    在该迁移中将 up 和 down 代码提取到公共方法中,并从新迁移中引用这些方法后 - 更新工作,然后创建了 person。为了安全起见-我将新调用package在 try catch... 我的新 UP 方法是否如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected override void Up(MigrationBuilder migrationBuilder)
        {
            try
            {
                new AddPeople().CreatePersonTable(migrationBuilder);
            }
            catch { }

            // Origional generated migration code
        }

    这个答案带有我没有测试过下次是否会覆盖此迁移(丢失代码)的 caviat - 但是如果迁移按顺序运行,那么您实际上可以运行一次,并且然后删除它。


    我过去曾收到过该错误消息....

    检查您在连接字符串中指定的数据库是否已创建。如果不是,则创建它然后执行代码。