我在WPF应用程序的EF Core项目上工作。 我们决定将DbContext拆分为2个smallers :(项目包含一个数据库)
public class FirstDbContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DBSet<Parameters>{ get; set; }
}
public class SecondDbContext: DbContext
{
public DBSet<User>{ get; set; }
public DBSet<Books> { get; set; }
public DBSet<Parameters>{ get; set; }
}
我们保持&#34;超级&#34; DbContext(包含来自DB的所有DbSet)以维护和迁移DB
public class SuperDbContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DBSet<User>{ get; set; }
public DBSet<Books> { get; set; }
public DBSet<Parameters>{ get; set; }
}....
重构代码的第一步是替换引用&#34; SuperDbContext ...&#34;正确的电话&#34; SecondDbContext.Books ...&#34;或&#34; FirstDbContext.Post&#34; ...确定
问题: 在客户端应用程序中,DbContext的选择取决于用户在启动应用程序时的选择:如果用户选择option1 =&gt; FirstDbContext,如果option2 =&gt; SecondDbContext。
我们如何编写代码来打开当前的DbContext来管理&#34;常见的DbSet&#34; (参数):在重构之前我们有例如: SuperDbContext.Parameters.FirstOrDefault()... 现在 ?我们必须写这样的东西:
if(option1)
{
FirstDbContext.Parameters.First()
}else
{
SecondDbContext.Parameters.First()
}
这对存储库有什么影响?因为如果我们维持这种方法,我们必须在2个存储库中复制代码:-(?
答案 0 :(得分:0)
不,不...忘记你提到的方法,你最终会写两遍你需要的代码。为什么不使用db上下文类型:
在您的函数开头,有一个if else
:
DbContext context;
if(option1)
{
context = new firstContextEntities();
}
else
{
context = new secondContextEntities();
}
由于您的两个上下文几乎完全相同,您将使用您的上下文将其转换为更大的上下文(具有最多访问权限的上下文):
var FirstLine = ((secondContextEntities)context).Parameters.First();