数据库优先方法的 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 Core - 代码优先迁移:关键字“NOT”附近的语法不正确