数据库优先方法的 EF 迁移?

Posted

技术标签:

【中文标题】数据库优先方法的 EF 迁移?【英文标题】:EF Migrations for Database-first approach? 【发布时间】:2012-03-04 12:57:57 【问题描述】:

我们在 EntityFramework 中使用数据库优先方法。 我们有几个客户,当我们部署新的产品版本时,我们现在使用SQL Compare 等工具“手动”应用数据库架构更改。

EF Migrations 是否可以帮助自动将更改应用到客户数据库?

【问题讨论】:

当然,我不愿意放弃任何东西,Code First Migration 功能似乎保留了数据,我希望 DB 先有类似的东西。我实际上想要这个用于简单的场景 - 添加新表、新字段等。 如果您想首先使用数据库实现与 EF 迁移类似的功能,请查看FluentMigrator 【参考方案1】:

据我所知,EF Migrations 是针对 CodeFirst 的产品,不支持 Database First 操作。

CodeFirst 假定您永远不会手动对数据库进行任何更改。对数据库的所有更改都将通过代码优先迁移。

【讨论】:

一个不错的选择可能是数据库项目/SSDT 并进行架构比较。 查看 tatigo 的回答【参考方案2】:

我认为有!您需要先继续编写代码。

为此,假设您有 EF Db 首先为您创建的以下 DbContext:

public class MyDbContext : DbContext

    public MyDbContext()
        : base("Name=DefaultConnection")
    

    

    // DbSets ...

将其更改为以下内容以首先使用代码及其所有魔术工具(迁移等):

public class MyDbContext : DbContext

    public MyDbContext()
        : base("YourDbFileName")
    

    

    // DbSets ...

这会导致 EF 在您的本地计算机上使用 SQL Express 在您的 web.config 文件中创建一个名为 YourDbFileName 的新连接字符串,就像最初创建的早期 DefaultConnection Db 一样。

您可能需要继续您的方式,就是根据您的服务器和其他选项编辑 YourDbFileName 约束。

更多信息here 和 here。

【讨论】:

SQlite数据库也是这样吗?【参考方案3】:

启动 Entity Framework 4.1 你可以做Code First Migrations with an existing database。

首先你有数据库,创建模型,启用迁移。

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

【讨论】:

【参考方案4】:

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

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

如果您对此发表评论:

throw new UnintentionalCodeFirstException();

那么迁移操作不会抛出异常。正如您可能想象的那样,迁移会查找这部分以了解每个实体的配置是什么表或表。

抱歉,如果我没有提供更多详细信息,如果您希望获得更多信息,我很乐意对其进行编辑并使其变得更好!

【讨论】:

这不适用于 SQLite。你得到错误:System.NotSupportedException: Creating a DbModelBuilder or writing the EDMX from a DbContext created using Database First or Model First is not supported. EDMX can only be obtained from a Code First DbContext created without using an existing DbCompiledModel.

以上是关于数据库优先方法的 EF 迁移?的主要内容,如果未能解决你的问题,请参考以下文章

骑士。 EF 代码优先迁移

EF Core - 代码优先迁移:关键字“NOT”附近的语法不正确

代码优先迁移中列的 EF6 Oracle 默认值

我可以将依赖项注入迁移(使用 EF-Core 代码优先迁移)吗?

EF6(代码优先)单个外键属性上的多个导航属性

EF数据库优先方法如何将新的非空列添加到生产表并在代码级别进行管理