如何从头开始删除和重新创建现有的EF Code First数据库

g.p*_*dou 70 ef-code-first ef-migrations

我在VS 2012中使用EF Code First和EF 5.我使用PM update-database命令,我有一个简单的种子方法来填充一些带有样本数据的表.

我想删除并重新创建我的x.mdb.更新历史记录似乎不同步.如果我在我的上下文中注释掉我的所有DBS,update-database运行时没有错误,但在DB中留下了一些表.由于我在数据库中没有有价值的数据,因此最简单的方法是重置所有内容.

我怎么能做到这一点?

NSG*_*aga 94

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

如果你想start clean:

1)手动删除你的数据库 - 无论它在哪里(我假设你的连接已被排序),或者清空它,但更容易/更安全的是将它们全部一起删除 - 因为有system __MigrationHistory表 - 你也需要删除它.

2)删除所有migration files - 在Migrations- 并且命名为数字等 - 删除它们全部,

3)重建包含迁移(以及其余部分)的项目 - 并确保您的项目已设置(配置)以自动构建(有时可能会导致问题 - 但对您来说不太可能),

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

  • 所以没有命令让ef迁移删除数据库本身? (3认同)
  • @lpacheco 如果您的生产数据库包含您不想销毁的数据,那么,呃,我恭敬地建议题为 *“如何删除......现有......数据库”* 的问题不是一个正确的问题为你。 (2认同)

小智 54

如果您使用该命令以正确的方式创建迁移,Add-Migration "Name_Of_Migration"则可以执行以下操作以获得干净的启动(重置,当然还有数据丢失):

  1. Update-database -TargetMigration:0

    因为执行了down方法,所以通常你的DB现在是空的.

  2. Update-database

    这将为您当前的迁移重新创建数据库

  • EF Core中的等效语法只是`Update-Database 0`.请注意,对于OP的情况,这是一个值得怀疑的情况**"更新历史记录似乎不同步"*; 这种方法的工作原理是对目前应用于数据库的每次迁移运行"向下"迁移,因此如果您删除了之前应用的迁移,那么这将失败(如果您已修改*a,它也可能会失败)申请后的迁移).因此,[接受的答案](/sf/answers/1125774821/)可能更受欢迎,因为无论您的迁移多么糟糕,它都能正常工作. (7认同)
  • Update-database -TargetMigration:0 需要 -f (force) 标志才能删除所有内容,否则它会说可能丢失数据。命令应该是:Update-database -TargetMigration:0 -f (2认同)

Ama*_*rdo 27

从Package Manager控制台中删除,创建和播种的单个Liner:

update-database -TargetMigration:0 | update-database -force
Run Code Online (Sandbox Code Playgroud)

KABOOM.

  • 为什么需要两次执行相同的步骤?"update-database -force"我的意思是 (5认同)
  • EF Core 中的等效语法就是“Update-Database 0”。无论如何,这不适合 OP 的情况,其中 *“更新历史记录似乎不同步”*;这种方法的工作原理是为迄今为止应用于数据库的每个迁移运行“向下”迁移,因此如果您删除了以前应用的迁移,那么这将失败(如果您 *修改* 一个,它可能同样失败应用后迁移)。[已接受的答案](/sf/answers/1125774821/) 更强大。-1,以及无法解释的“update-database -force”重复。 (2认同)

Giz*_*399 20

对于EntityFrameworkCore,您可以使用以下内容:

Update-Database -Migration 0
Run Code Online (Sandbox Code Playgroud)

这将从数据库中删除所有迁移.然后你可以使用:

Remove-Migration
Run Code Online (Sandbox Code Playgroud)

删除迁移.最后,您可以重新创建迁移并将其应用于数据库.

Add-Migration Initialize
Update-Database
Run Code Online (Sandbox Code Playgroud)

在EFCore v2.1.0上测试

  • 奇迹般有效! (2认同)
  • 5 上不起作用 (2认同)
  • 我纠正了。它是“-Migration 0”,我认为您必须输入要恢复到的迁移的名称。5 内即可生效! (2认同)
  • 注意:“Remove-Migration”适用于 EF Core;对于使用 EF 6 的项目,您必须手动删除迁移文件。 (2认同)

Alr*_*eed 6

我使用的是.net Core 6,这段代码直接从Program.cs中剥离出来

using Microsoft.EntityFrameworkCore;

namespace RandomProjectName
{
    public class Program
    {
        public static async Task<int> Main(string[] args)
        {
            var connectionString = "Server=YourServerName;Database=YourDatabaseName;Integrated Security=True;";
            
            var optionsBuilder = new DbContextOptionsBuilder<YourDataContext>();
            optionsBuilder.UseSqlServer(connectionString);
            
            var db = new YourDataContext(optionsBuilder.Options);
            db.Database.EnsureDeleted();
            db.Database.Migrate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您至少应该进行初始迁移才能使其发挥作用。


SAm*_*SAm 5

怎么样 ..

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

我从《编程实体框架:代码优先》第 28 页第一版中摘取了这一点。

  • 这不是一个好的艾达。这段代码很可能会进入生产阶段,而您最终会让您的客户感到非常头疼...... (12认同)

小智 5

dbctx.Database.EnsureDeleted(); dbctx.Database.EnsureCreated();