- 创建数据库上下文
public class DBContext_A : DbContext
{
public DBContext_A(DbContextOptions<DBContext_A> options) : base(options)
{
}
}
public class DBContext_B : DbContext
{
public DBContext_B(DbContextOptions<DBContext_B> options) : base(options)
{
}
}
public class DBContext_C : DbContext
{
public DBContext_C(DbContextOptions<DBContext_C> options) : base(options)
{
}
}
- 为每个 DBContext 定义一个连接字符串:
{
"ConnectionStrings": {
"Connection_A": "Server=(localdb)\\mssqllocaldb;Database=DB_A;Trusted_Connection=True;...",
"Connection_B": "Server=(localdb)\\mssqllocaldb;Database=DB_B;Trusted_Connection=True;...",
"Connection_C": "Server=(localdb)\\mssqllocaldb;Database=DB_C;Trusted_Connection=True;...",
}
}
- 在启动时注册:
services.AddDbContext<DBContext_A>(ops =>
{
ops.UseSqlServer(Configuration.GetConnectionString($"Connection_A"));
});
services.AddDbContext<DBContext_B>(ops =>
{
ops.UseSqlServer(Configuration.GetConnectionString($"Connection_B"));
});
services.AddDbContext<DBContext_C>(ops =>
{
ops.UseSqlServer(Configuration.GetConnectionString($"Connection_C"));
});
- 注入控制器:
public FooController : Controller
{
private readonly DBContext_A _context_A;
private readonly DBContext_B _context_B;
private readonly DBContext_C _context_C;
public FooController(
DBContext_A context_A,
DBContext_B context_B,
DBContext_C context_C)
{
_context_A = context_A;
_context_B = context_B;
_context_C = context_C;
}
}
Code First 方法的其他最佳实践:
为每个上下文创建一个类库,因此当您应用迁移时,每个上下文将在其自己的项目中拥有自己的迁移文件夹。
- Solution
- MainProject
- ClassLibrary_A
- ClassLibrary_B
- ClassLibrary_C
在多上下文解决方案中应用迁移时;
- 从解决方案资源管理器中,将主项目(带有startup.cs)设置为“启动项目”
- 从包管理器控制台将相关的 ClassLibrary_A 或 B 或 C 设置为“默认项目”
- 将目标上下文添加到每个 cmd 中,如下所示:
PM > add-migration Init -Context DBContext_A
PM > update-database -Context DBContext_A
PM > add-migration Init -Context DBContext_B
PM > update-database -Context DBContext_B
PM > add-migration Init -Context DBContext_C
PM > update-database -Context DBContext_C
或者,您可以使用完整的 PM cmd,如下所示:
PM > add-migration Init -Context DBContext_A -Project ClassLibrary_A -StartupProject MainProject
PM > update-database -Context DBContext_A -Project ClassLibrary_A -StartupProject MainProject
PM > add-migration Init -Context DBContext_B -Project ClassLibrary_B -StartupProject MainProject
PM > update-database -Context DBContext_B -Project ClassLibrary_B -StartupProject MainProject
PM > add-migration Init -Context DBContext_C -Project ClassLibrary_C -StartupProject MainProject
PM > update-database -Context DBContext_C -Project ClassLibrary_C -StartupProject MainProject