实体框架DDD

时间:2018-05-14 14:57:23

标签: entity-framework domain-driven-design bounded-contexts

我在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个存储库中复制代码:-(?

1 个答案:

答案 0 :(得分:0)

不,不...忘记你提到的方法,你最终会写两遍你需要的代码。为什么不使用db上下文类型:

在您的函数开头,有一个if else

DbContext context;

if(option1)
{
    context = new firstContextEntities();
}
else
{
    context = new secondContextEntities();
}

由于您的两个上下文几乎完全相同,您将使用您的上下文将其转换为更大的上下文(具有最多访问权限的上下文):

var FirstLine = ((secondContextEntities)context).Parameters.First();