【问题标题】:entity framework DDD实体框架 DDD
【发布时间】:2018-05-14 14:57:22
【问题描述】:

我从事 WPF 应用程序的 EF Core 项目。 我们决定将 DbContext 拆分为 2 个较小的部分:(该项目包含一个数据库)

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; }  
}

我们保留一个“超级” DbContext(其中包含数据库中的所有 DbSet)来维护和迁移数据库

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; }  
}....

重构代码的第一步是将引用“SuperDbContext...”的行替换为正确的调用“SecondDbContext.Books...”或“FirstDbContext.Post”...OK

问题: 在客户端应用中,DbContext 的选择取决于用户在应用启动时的选择:如果用户选择 option1 => FirstDbContext,如果 option2 => SecondDbContext。

我们如何编写代码来打开当前 DbContext 以管理“通用 DbSet”(参数):在重构之前,我们有例如: SuperDbContext.Parameters.FirstOrDefault()... 现在 ?我们必须写这样的东西吗:

if(option1)
{
    FirstDbContext.Parameters.First()
}else
{
    SecondDbContext.Parameters.First() 
}

对存储库有什么影响?因为如果我们保持这种方法,我们必须在 2 个存储库中复制代码 :-( ?

【问题讨论】:

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


    【解决方案1】:

    不不...忘记您提到的方法,您最终会编写两倍所需的代码。为什么不直接使用 db 上下文类型:

    在函数的开头,单个 if else

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

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

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

    【讨论】:

    • 是的,谢谢,但我的问题是关于“共享”实体(或像参数表这样的公共数据:如何管理所有公共实体?(这是维护每个共享 DbSet 的好解决方案吗?有界上下文或仅使用共享数据创建另一个?)。如果我打算将公共 DbSet 维护到每个有界上下文中,我必须将代码复制到存储库中?
    • 等等,你只有一个参数表,但有两个使用它的存储库?
    • 你需要一个完整的逻辑架构...... StackOverflow 不会为你提供它背后的全部理论。
    猜你喜欢
    • 2017-05-21
    • 2017-02-11
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多