首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF Core Migration with multiple provider始终运行SQL Server脚本

EF Core Migration with multiple provider始终运行SQL Server脚本
EN

Stack Overflow用户
提问于 2018-04-12 16:02:31
回答 1查看 1.5K关注 0票数 0

我首先使用EF核心代码,当使用多个DB提供程序(SQL Server和MySql)时,我有一个问题。即使我选择使用SQL提供程序,也会使用MySql服务器迁移文件。

查看示例project

EN

回答 1

Stack Overflow用户

发布于 2018-12-04 04:18:27

使用实体框架核心编写特定于提供程序的迁移、数据库初始化器和服务可能是一项艰巨的任务。使用AdaptiveClient可以极大地简化该过程。AdaptiveClient是一个与Autofac配合使用的实用程序,用于针对多个数据库提供程序或传输提供服务层。AdaptiveClient.EntityFrameworkCore是一个附加组件,其中包括用于使用实体框架核心的实用程序。简而言之,it AdaptiveClient是如何工作的:

IMigrationContext是一个占位符接口,它允许您将DbContext与特定的提供者(MSSQL、MySql等)相关联,以便创建迁移。IDbContextOptions是一个占位符接口,它允许您关联特定于您的提供商的DbContextOptions实现。RegistrationHelper是一个实用程序,可以简化向Autofac注册组件的过程。RegisterMigrationContext是一种方法,您可以调用它来轻松注册特定于提供程序的迁移上下文。

要创建特定于提供程序的迁移,需要为每个要作为目标的数据库提供程序创建一个类。这些类派生自您的DbContext并实现IMigrationContext (没有成员):

代码语言:javascript
复制
public class MyDbContext_MSSQL : MyDbContext, IMigrationContext
{
    public MyDbContext_MSSQL(DbContextOptions options) : base(options)
    {

    }
}   


public class MyDbContext_MySQL : MyDbContext, IMigrationContext
{
    public MyDbContext_MySQL(DbContextOptions options) : base(options)
    {

    }
}

上面的例子是完整的-你不需要写任何额外的代码。您不需要为每个提供程序创建单独的DbContext (除非您希望这样做)。您需要为每个提供程序创建一个类的原因是,当您运行dotnet ef migrations add...时,EF会反映您的程序集以查找正确的DbContext。

创建包装DbContextOptions并实现IDbContextOptions的类

代码语言:javascript
复制
public class DbContextOptions_MSSQL : IDbContextOptions
{
    public DbContextOptions Options { get; set; }

    public DbContextOptions_MSSQL(string connectionString)
    {
        DbContextOptionsBuilder builder = new DbContextOptionsBuilder();
        builder.UseSqlServer(connectionString);
        Options = builder.Options;
    }
}


public class DbContextOptions_MySQL : IDbContextOptions
{
    public DbContextOptions Options { get; set; }

    public DbContextOptions_MySQL(string connectionString)
    {
        DbContextOptionsBuilder builder = new DbContextOptionsBuilder();
        builder.UseMySql(connectionString);
        Options = builder.Options;
    }
}

使用AdaptiveClient RegistrationHelper将您的类注册到Autofac:

代码语言:javascript
复制
registrationHelper.RegisterMigrationContext<Database.Db_MSSQL>(API_Name.MyAPI, DataBaseProviderName.MSSQL);
registrationHelper.RegisterMigrationContext<Database.Db_MySQL>(API_Name.MyAPI, DataBaseProviderName.MySQL);

registrationHelper.RegisterDbContextOptions<DbContextOptions_MSSQL>(DataBaseProviderName.MSSQL);
registrationHelper.RegisterDbContextOptions<DbContextOptions_MySQL>(DataBaseProviderName.MySQL);    

在上面的代码中,API_Name只是一个常量,它可以解析为一个简单的字符串,如"MyApplicationName“。DataBaseProviderName.MSSQL和.MySQL也是如此。它们是解析为"MSSQL“或"MySQL”的字符串常量。

现在,最重要的部分是:就像使用"MSSQL“或"MySQL”这样的键注册应用程序的组件一样,也要使用这些常量注册应用程序的连接字符串。

这允许Autofac根据应用程序当前使用的连接字符串来解析正确的特定于提供程序或特定于传输的组件。您可以阅读整个process here

您可以在Zamagon Demo中查看完整的工作示例。该演示演示了用于集成测试的迁移、数据库初始化器和删除并重新创建场景。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49791087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档