在EF 6的同一数据库中使用多个dbcontexts

时间:2017-02-17 15:15:19

标签: c# design-patterns entity-framework-6

我已经看到了这个问题的一般区域中的一些答案,但没有一个直接得到我所看到的。我继承了最近的代码库,其中包含了一个使代码运行得更快的代码库。在我看来,数据库中的每个表(一个数据库)都有自己的dbcontext。这些表是高度相关的,我不断看到的主要问题是需要根据表之间的外键关系做出决策。使用这种设计方法,每次涉及两个表时,开发人员使用每个上下文的语句嵌套(对他来说是好的自动清理,右边),从表A中获取数据,然后逐行循环遍历表B以查找匹配项(通常我们对非匹配感兴趣,以便我们可以更新表B),然后继续。我当然看到应用程序中使用了多个上下文,但我从未见过这种“模式”,也无法弄清楚为什么会使用它。在我重写应用程序的这一部分以便每个表位于相同的上下文之前,我觉得我应该做一个理智/现实检查,以确保没有一些非常糟糕的怪物在等我。显然,我找不到任何东西。这是一个伪代码段(具有表名和列名更改的确切代码):

 var beers = from b in beerContext.AllBeersOffered
    where b.CurrentStock = 1
    select b;
    foreach(var beer in beers)
    {
        Bars bars = barContext.AllBeersCarried.FirstOrDefault(x=>x.BeerId==beer.Id)
        if(bars == null)
        { 
            //Create a List of beers offered but not carried in that bar, 
            // which is then added to another table.
        }
    }

同样,我倾向于非常喜欢Whiskey-Tango-Foxtrot,将表格移动到一个DbContext并在一个插页中处理,但这需要假设更深层次的真正,非常糟糕的编码而不是我很舒服。显然,原来的程序员早已离开了公司,我们完全认为这个职业。但是,他显然是一个非常有经验的开发人员(虽然是Java),所以我不喜欢假设无能为力,因为它可能是我所缺少的。我的问题是,你能证明这个设计的合理性,如果是的话,我应该寻找什么?

2 个答案:

答案 0 :(得分:2)

这是一个反模式,很大的时间!

我见过初学者这样做,尤其是当来自DAO背景时,每个实体都有自己的数据访问镜像。

彻底违背了像Entity Framework这样的成熟OR映射器的目的,它旨在跨越关系模型和对象模型之间的鸿沟。此类OR映射器设计为尤其,以表格形式(子指父级)将关联映射到面向对象形式的关联(父级拥有子级)。

所以是的,继续将相关实体抓到代表应用程序中自然聚合的上下文中。

答案 1 :(得分:1)

我建议您制作粗粒度DbContexts,但不要将整个架构移动到一个DbContext

您可以遵循DDD实践,其中一个重要的表作为根,然后它与一些强烈依赖它的相关表一起使用。该结构称为聚合。在我的设计中,我通常会聚合DbContext

另一方面,应该在需要时重新定义操作,以便每个操作仅处理一个聚合。它可以从其他聚合中选择ID,进行查询以收集所需的所有数据,然后仅对一个聚合进行更改。这种设计方法可以极大地简化代码。