.NET中使用Entity Framework配置双数据库独立连接的方法
实现方案
Entity Framework 中单个DbContext只能绑定一个数据库连接,无法在同一个上下文类中直接将不同DbSet映射到不同数据库,你需要拆分出两个独立的DbContext类,分别绑定对应的连接字符串即可。
步骤1:定义两个独立的DbContext
你可以根据需求选择删除原有混合了两个DbSet的ApplicationDbContext,或是保留该类用于对接原DefaultConnection连接的旧表,仅把分属两个库的实体集移到新的独立上下文中:
/// <summary> /// 日志数据库上下文,对应BIFASTAPI_Log库 /// </summary> public class LogDbContext : DbContext { public LogDbContext() : base("name=DevSaveLog") { } // 仅存放属于日志库的实体 public DbSet<ActivityLog> ActivityLogs { get; set; } } /// <summary> /// 注册信息数据库上下文,对应BIFASTAPI_Reg库 /// </summary> public class RegistrationDbContext : DbContext { public RegistrationDbContext() : base("name=DevSaveRegis") { } // 仅存放属于注册库的实体 public DbSet<RegistrationData> RegistrationDatas { get; set; } }
构造函数中
name=xxx是EF6的推荐写法,会明确从配置文件的connectionStrings节点匹配对应名称的连接串,避免EF按默认规则匹配到错误连接。
步骤2:业务代码中按需使用对应上下文
操作哪个库的数据,就实例化对应的DbContext即可,示例:
// 写入活动日志,自动连接BIFASTAPI_Log库 using (var logCtx = new LogDbContext()) { logCtx.ActivityLogs.Add(new ActivityLog { // 按实体字段赋值 }); logCtx.SaveChanges(); } // 查询/写入注册数据,自动连接BIFASTAPI_Reg库 using (var regCtx = new RegistrationDbContext()) { var validRegList = regCtx.RegistrationDatas.Where(x => x.IsValid).ToList(); // 其他数据操作 regCtx.SaveChanges(); }
配置注意事项
如果使用EF迁移功能生成、更新数据库结构,需要分别为两个上下文执行迁移命令,避免表结构更新到错误的库,以包管理器控制台命令为例:
- 为日志库启用迁移:
Enable-Migrations -ContextTypeName LogDbContext -MigrationsDirectory Migrations/LogMigrations - 为注册库启用迁移:
Enable-Migrations -ContextTypeName RegistrationDbContext -MigrationsDirectory Migrations/RegMigrations
后续执行Add-Migration、Update-Database命令时,都需要通过-Context参数指定当前操作的上下文类型。
如果项目使用依赖注入框架,只需要把两个DbContext分别注册到容器中,使用时按需注入对应上下文实例即可。
内容的提问来源于stack exchange,提问作者Sigit Budi
相关产品推荐
相关产品推荐

