使用 EF6(和 Code First 迁移)针对不同的数据库系统

Posted

技术标签:

【中文标题】使用 EF6(和 Code First 迁移)针对不同的数据库系统【英文标题】:Targeting different database systems with EF6 (and Code First Migrations) 【发布时间】:2014-12-10 14:49:36 【问题描述】:

我的项目(WPF、.Net 4.5、EF6)必须针对不同的 DBMS,到目前为止它是 MSSQL、Oracle、mysql 和 Firebird。 我首先创建生成数据库的依赖于 dbs 的脚本,然后使用 Entity Frameworks Database-First-approach 创建模型。通过使用基于 MSSQL 的默认 edmx 并为其他提供程序创建单独的 ssdl(可以在连接字符串中配置不同的 ssdl 文件),这对所有 dbms 都非常有效。 我现在看到的问题是为更多客户维护 4 个或更多不同 dbms 的安装/更新。我们不会派管理员为我们的客户安装更新,我们宁愿需要一个通用的设置/更新例程之类的东西。这是可能的,但您必须为每个 dbms 维护不同版本的 sql 脚本,并使用一种设置工具来处理这些脚本并知道为哪个数据库执行哪个(取决于 dbms 和当前版本)。

在寻找替代方案时,我遇到了 EF Code First Migrations 并尝试切换到这种方法。到目前为止,我的尝试都是基于 MSSQL 和 MySql。

当我坚持使用 MSSQL 或 MySql 时,一切都很好。创建迁移,将它们应用到现有或不存在的数据库,所有这些工作都很好。 但我坚持将两个系统结合在一起。例如,将基于 MSSQL 的迁移应用到 MySql 似乎是不可能的。将创建数据库,但由于类型不匹配等原因无法连接。 我的猜测是“__Migration”-Table 包含一个基于 MSSQL 创建的模型,现在与 MySql-provider 不兼容。只是一个理论,但也许有人知道得更好。

有人知道这个的解决方案吗?有没有办法用 EF 来定位不同的 dbms? 我不敢相信我是唯一一个有这个问题的人,但很难找到任何关于这个问题的信息。 感谢您提供任何帮助,甚至将我引向除以这种方式使用 EF 或完全使用 EF 之外的其他方法。

【问题讨论】:

【参考方案1】:

我遇到了同样的情况,但我找到了简单的解决方法。您需要的只是为启用迁移的每个数据库系统创建单独的项目。在您的情况下,两个数据库上下文应该从一个基本上下文继承,所有模型构建器和 DbSet 都保存在该基本上下文中。

示例模型:

// MyModel.Base.csproj
public class Person  /*..*/ 

public class BaseDbContext : DbContext

    public DbSet<Person> People  get; set; 

    /*...*/


// MyModel.Sql.csproj

public class SqlDbContext : BaseDbContext 

// MyModel.MySql.csproj

public class MySqlDbContext : BaseDbContext 

也许有两个迁移设置不是那么好主意,但您可以在迁移中使用一些特定于数据库的脚本。

【讨论】:

以上是关于使用 EF6(和 Code First 迁移)针对不同的数据库系统的主要内容,如果未能解决你的问题,请参考以下文章

ef6 code first,对已有数据库如何执行迁移

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列

EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe

自创建数据库以来,支持上下文的模型已更改。考虑使用 Code First 迁移来更新数据库

具有通用存储库和依赖注入和 SoC 的 EF6 Code First

在 EF6 Code First 中支持表值函数吗?