我首先使用EF核心代码,当使用多个DB提供程序(SQL Server和MySql)时,我有一个问题。即使我选择使用SQL提供程序,也会使用MySql服务器迁移文件。
查看示例project
发布于 2018-12-04 04:18:27
使用实体框架核心编写特定于提供程序的迁移、数据库初始化器和服务可能是一项艰巨的任务。使用AdaptiveClient可以极大地简化该过程。AdaptiveClient是一个与Autofac配合使用的实用程序,用于针对多个数据库提供程序或传输提供服务层。AdaptiveClient.EntityFrameworkCore是一个附加组件,其中包括用于使用实体框架核心的实用程序。简而言之,it AdaptiveClient是如何工作的:
IMigrationContext
是一个占位符接口,它允许您将DbContext与特定的提供者(MSSQL、MySql等)相关联,以便创建迁移。IDbContextOptions
是一个占位符接口,它允许您关联特定于您的提供商的DbContextOptions实现。RegistrationHelper
是一个实用程序,可以简化向Autofac注册组件的过程。RegisterMigrationContext
是一种方法,您可以调用它来轻松注册特定于提供程序的迁移上下文。
要创建特定于提供程序的迁移,需要为每个要作为目标的数据库提供程序创建一个类。这些类派生自您的DbContext并实现IMigrationContext
(没有成员):
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
的类
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:
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中查看完整的工作示例。该演示演示了用于集成测试的迁移、数据库初始化器和删除并重新创建场景。
https://stackoverflow.com/questions/49791087
复制相似问题