问题:如何切换EF Core的数据源

问题的提出,在实际项目中,根据不同用户的需要,可能需要更改使用的数据库类型,比如,在某个项目中使用SqlServer,而在另一个项目中需要使用Sqlite。在使用EF6时,可以通过更换配置文件中的provider更改数据源,可是EF core似乎是在代码中进行注册的:

builder.UseSqlServer(options.ExistingConnection);

如何更改为其它数据库?没有发现很好的办法,只能是修改StartUp,在编码中注册切换。

1、安装Microsoft.EntityFrameworkCore.Sqlite
2、修改

using Abp.Modules;
using Abp.Reflection.Extensions;
using Microsoft.EntityFrameworkCore;
using Zl.TangPoem.STD;

namespace ZL.TangPoem.STD.EF
{
    [DependsOn(
     typeof(PoemCoreModule),
      typeof(AbpEntityFrameworkCoreModule))]
    public class PoemDataModule : AbpModule
    {
        /* 在单元测试时,使用EF Core的内存数据库,不需要进行数据库注册 */
        public bool SkipDbContextRegistration { get; set; }
        //增加sqlite sqlserver切换
        public string DbType { get; set; }

        /// 
        /// 初始化时注册DbContext
        /// 
        public override void PreInitialize()
        {
            if (!SkipDbContextRegistration)
            {
                if (DbType == "sqlite")
                {
                    Configuration.Modules.AbpEfCore().AddDbContext(options =>
                    {
                        var builder = options.DbContextOptions;
                        if (options.ExistingConnection != null)
                        {
                            builder.UseSqlite(options.ExistingConnection);
                        }
                        else
                        {
                            builder.UseSqlite(options.ConnectionString);
                        }
                    });
                }
                else
                {
                    Configuration.Modules.AbpEfCore().AddDbContext(options =>
                    {
                        var builder = options.DbContextOptions;
                        if (options.ExistingConnection != null)
                        {
                            builder.UseSqlServer(options.ExistingConnection);
                        }
                        else
                        {
                            builder.UseSqlServer(options.ConnectionString);
                        }
                    });
                }
                
            }
        }
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(typeof(PoemDataModule).GetAssembly());
        }
    }
}

3、修改调用模块,增加数据库类型设置:

using System.Reflection;
using Zl.TangPoem.STD;
using ZL.TangPoem.STD.Application;
using ZL.TangPoem.STD.EF;

namespace ZL.TangPoem.Core.ConsoleClient
{
    [DependsOn(typeof(PoemCoreModule),
      typeof(PoemDataModule),
      typeof(PoemApplicationModule))]
    public class PoemConsoleClientModule : AbpModule
    {
        /// 
        /// 增加数据库选项
        /// 
        /// 
        public PoemConsoleClientModule(PoemDataModule dataModule)
        {
            dataModule.DbType = "sqlite";

        }
        public override void PreInitialize()
        {
            var conn = @"Data Source=D:\Poem\Sqlite\Poem.db";
            Configuration.DefaultNameOrConnectionString = conn;
           // Configuration.DefaultNameOrConnectionString = "Server=localhost; Database=PoemNew; Trusted_Connection=True;";
        }
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }
}

这种方式并不是很好,因为增加了对两种数据库类型的依赖,另外,如果再增加数据库类型,仍然要修改代码,达不到动态更换的目的。应该有更好的办法,不过目前还没有发现。

你可能感兴趣的:(问题:如何切换EF Core的数据源)