2013-04-16 33 views
43

我在EF 2012中使用EF代码优先EF 5。我使用PM update-database命令,我有一个简单的种子方法来填充一些表格样本数据。如何从头开始删除并重新创建一个现有的EF代码优先数据库

我想删除并重新创建我的x.mdb。更新历史记录似乎不同步。如果我在我的上下文中注释掉所有我的DBSets,则update-database将不会发生错误,但会在数据库中留下一些表。因为我在数据库中没有有价值的数据,所以似乎最简单的就是重置所有的东西。

我该如何做到这一点?

回答

61

如果我的理解是正确的......

如果你想start clean

1)手动删除您的数据库 - 无论它是(我假设你有你的连接进行排序)或清空它,但更容易/更安全的是将它们全部删除 - 因为有system __MigrationHistory表格 - 您也需要将其删除。

2)删除所有migration files - 这是Migrations下 - 并命名为相同的数字等等 - 将它们全部删除,

3)重建项目包含迁移(其余的) - 并确保项目设置(配置)自动建立(有时可能会产生问题 - 但不太可能给你),

4)再次运行Add-Migration Initial - 然后Update-Database

+2

因此,没有命令可以通过迁移来删除数据库本身? – cjb110

+1

......据我所知(不知道最新版本) - EF/migrations擅长于在没有Db时创建,然后在更改代码时进行“更新”。但是当你需要做一些管理维护时,你必须弄清楚 – NSGaga

+1

我还必须从SQL服务器对象浏览器中删除数据库。 –

40

如果你工作的正确方法使用命令Add-Migration "Name_Of_Migration"创建您的迁移,那么你可以做以下获得干净启动(复位,丢失数据,当然的):

  1. Update-database -TargetMigration:0

    由于执行了down方法,通常您的数据库是空的。

  2. Update-database

    这将重新创建你的数据库到当前的迁移

+0

Update-database -TargetMigration:0需要-f(强制)标志才能删除所有内容,否则会说可能会丢失数据。命令应该是: 更新数据库-TargetMigration:0 -f – Tascalator

+0

@Tascalator,我只是试过这个没有-f,并没有关于可能的数据丢失的警告。使用EF 6.1.2,表中有数据被删除。 – jk7

+1

EF Core中的等效语法只是'Update-Database 0'。请注意,对于OP的情况,这是一个值得怀疑的情况,其中*“更新历史记录似乎不同步”*;这种方法通过对迄今为止应用于数据库的每次迁移运行“向下”迁移来实现,所以如果您删除了以前应用的迁移,那么这将失败(并且如果您已经*修改了* a在应用之后迁移)。 [接受的答案](https://stackoverflow.com/a/16082497/1709587)可能会更好,因为无论您的迁移有多糟糕,它都可以工作。 –

2

如何..

static void Main(string[] args) 
{ 
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>()); 
    // C 
    // o 
    // d 
    // i 
    // n 
    // g 
} 

我从Programming Entity Framework: Code First,第28页第一版就捡起。

+5

这不是一个好的ida。有可能这个代码可能会达到生产,你最终会对你的客户感到头疼...... –

22

单排下降,从包管理器控制台创建和种子:

update-database -TargetMigration:0 | update-database -force 

KABOOM。

+5

为什么需要两次执行相同的步骤? “update-database -force”我的意思是 – SwissCoder

+0

只是一个小通知:“AutomaticMigrationDataLossAllowed = true;”在Configration中是必需的。 – Unicco

+0

EF Core中的等效语法只是'Update-Database 0'。无论如何,这不适合OP的情况,其中*“更新历史记录似乎不同步”*;这种方法通过对迄今为止应用于数据库的每次迁移运行“向下”迁移来实现,所以如果您删除了以前应用的迁移,那么这将失败(并且如果您已经*修改了* a在应用之后迁移)。 [接受的答案](https://stackoverflow.com/a/16082497/1709587)更强大。 -1,以及'update-database -force'的无法解释的重复。 –

0

采取以下步骤:

  1. 删除应当从上下文// Dbset<Item> Items{get;set;} 和的NuGet控制台被删除运行这些命令
  2. 附加迁移[CONTEXTNAME]
  3. 更新数据库中的那些对象-verbose

它将删除上下文中不存在但已在数据库中创建的表(s)

相关问题