使用EF6(和Code First Migrations)定位不同的数据库系统

时间:2014-10-15 13:37:34

标签: mysql sql-server database entity-framework ef-migrations

我的项目(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 个答案:

答案 0 :(得分:0)

我有相同的情况,但我找到了简单的解决方法。您需要的一切只是为每个启用了迁移的数据库系统创建单独的项目。在您的情况下,两个数据库上下文应该从一个基本上下文继承,其中保留所有模型构建器和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 {}

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

相关问题