EF迁移适用于基于数据库的方法吗?

46
我们正在使用Entity Framework的Database First方法。 我们有几个客户,当我们部署新产品版本时,我们现在使用像SQL Compare这样的工具手动应用DB模式更改。
EF迁移是否可以帮助自动将更改应用于客户端的数据库?

当然,我不想失去任何东西,Code First Migration 功能似乎可以保留数据,我希望 DB First 也有类似的功能。实际上,我希望这个功能适用于简单的场景 - 添加新表、新字段等。 - Shaddix
1
如果您想要类似于 EF Migrations 的数据库迁移功能,可以尝试使用 FluentMigrator - John Mo
4个回答

24
据我所知,EF Migrations是针对CodeFirst的产品,不支持Database First操作。
CodeFirst假设您不会手动更改数据库,所有对数据库的更改都将通过代码的第一次迁移完成。

6
一个不错的替代方案可能是使用数据库项目/SSDT并进行模式比较。 - Dan Esparza
1
请查看tatigo的答案。 - IEnjoyEatingVegetables

5
我认为有!您需要先继续通过代码进行操作。
为此,假设您拥有以下 DbContext,这是 EF Db first 为您创建的:
public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("Name=DefaultConnection")
    {

    }

    // DbSets ...
}

将以下内容更改为使用Code First及其所有魔法工具(迁移等)的方式开始:

将其更改为以下内容:

public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("YourDbFileName")
    {

    }

    // DbSets ...
}

它会导致EF在您的web.config文件中使用SQL Express在本地机器上创建一个名为YourDbFileName的新连接字符串,类似于早期创建的DefaultConnection Db。
您需要继续进行的所有操作可能只是根据您的服务器和其他选项编辑YourDbFileName ConStr。
更多信息请参见此处此处

SQLite数据库也是同样的情况吗? - fedeteka

3

从Entity Framework 4.1开始,您可以使用现有数据库的Code First迁移

因此,首先您需要有数据库,创建模型,启用迁移。

最重要的是要记住,在对架构进行任何更改之前,应该运行Enable-Migrations,因为它应该在您的数据库和代码之间同步。


0

只需查找您的DbContext子对象并查找此方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

如果您对此进行评论:
throw new UnintentionalCodeFirstException();

那么异常将不会在迁移操作上抛出。正如您所想象的那样,迁移将寻找此部分以了解每个实体与哪些表格的配置。

如果我没有提供足够的细节,对不起。如果您需要更多信息,我很乐意编辑并改进它!


这在SQLite上不起作用。您会收到错误消息:System.NotSupportedException:不支持从使用Database First或Model First创建的DbContext创建DbModelBuilder或编写EDMX。只能从未使用现有DbCompiledModel创建的Code First DbContext获取EDMX。 - stigzler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接