新建EFCoreContext.cs文件
public class EFCoreContext : DbContext
{
private string strConn = "";
public EFCoreContext(string conn)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(strConn);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
新建IDbContextFactory.cs
public interface IDbContextFactory
{
public EFCoreContext CreateContext(WriteAndReadEnum writeAndRead);
}
创建operationEnum.cs实现数据库操作动作
public enum operationEnum
{
Write,
Read,
Delete
}
新建DbContextFactory.cs实现接口
public class DbContextFactory : IDbContextFactory
{
private IConfiguration _Configuration;
private string[] ReadConnectionString = null;
public DbContextFactory(IConfiguration configuration)
{
_Configuration = configuration;
ReadConnectionString = _Configuration.GetConnectionString("ReadDataBase").Split(",");
}
public EFCoreContext CreateContext(operationEnum writeOrRead)
{
string sqlConn = string.Empty;
switch (writeOrRead)
{
case operationEnum.Write:
sqlConn = _Configuration.GetConnectionString("WriteDataBase");
break;
case operationEnum.Read:
sqlConn = GetReadConnectionString();
break;
default:
break;
}
return new EFCoreContext(sqlConn);
}
/// 可以自定义从库的数据库连接策略
private string GetReadConnectionString()
{
///随机策略
//权重策略
//轮询策略
return ReadConnectionString[0];
}
}
然后在startup.cs中注入
services.AddScoped<IDbContextFactory, DbContextFactory>();
然后就可以在controller使用
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IDbContextFactory _DbContextFactory;
public HomeController(ILogger<HomeController> logger, IDbContextFactory dbContextFactory)
{
_logger = logger;
_DbContextFactory = dbContextFactory;
}
public IActionResult Index()
{
EFCoreContext writecontext = _DbContextFactory.CreateContext(operationEnum.Write);
......
writecontext.SaveChanges();
EFCoreContext queyrcontext = _DbContextFactory.CreateContext(operationEnum.Read);
.......
return View();
}
}
原文:https://www.cnblogs.com/hwxing/p/12906388.html