实体框架,存储库模式和2个DB

时间:2017-11-25 14:26:09

标签: .net entity-framework design-patterns domain-driven-design

我正在开发一个适用于2个DB的应用程序。我想使用 EF,Repository和UnitOfWork 模式。我正在学习干净的代码原则和设计模式,所以想得到一些反馈,因为虽然我(想)理解了主要的想法,但我在实现中有点挣扎。我已经提到了很多答案和文章,但仍然无法完全将这些想法引入我的具体问题。

我有2个DB。

  1. 我们的ERP系统的遗留数据库。仅读取访问权限(又名 ERP-DB )。从这个数据库我必须得到我需要的所有信息。
  2. 项目-DB。需要创建并为此我没有任何限制。 (又名 Project-DB
  3. 首先,如果我理解为ERP-DB,我应该使用DBFirst方法,因为我无法修改数据库,而对于项目数据库,我可以使用任何人,因为CodeFirst可能是最好的方法(因为我我试图做DDD)所以我可以先设计我的域模型,然后定义将持久化的内容。

    现在有一个问题:

    • ERP-DB非常通用"并且例如有一个表"文章"。在这里,您可以找到我们拥有的任何类型的文章,从完整的构建设备到装配件。 因此,对于DBFirst,EF为其生成一个名为" Articles"的实体。但是我不想在我的域模型中使用这样的类,我希望更好的类如transmittertermometermeasureCell等等。它们是"具体& #34;文章。所以我需要将Articles映射到不同的域对象。

      • 我是否需要手动完成,或者EF可以在DBFirst中为我做这件事吗?
      • 如果手动,我应该为每个域对象创建一个存储库并将映射逻辑放入其中吗?或者我应该创建2个存储库,1个用于数据实体,1个用于域对象,然后在哪里放置地图逻辑?
      • 某些特定文章包含多个article,即transmitter具有measureCell,两个实体位于同一articles表中。那么我的TransmitterRepository应该有一个方法,知道如何检索变送器或者我应该把这个逻辑放在哪里?

    现在,关于project-DB,我可以使用CodeFirst专注于我的域模型并定义需要持久化的内容。因此,如果我选择这种方法并正确理解它,我可以直接将我的数据实体映射到我的域对象。但是我完全不了解它,因为对我来说,我只是在其他地方使用相同的逻辑,而不是在repos中将它直接放在我的对象中,但是我和#34; win"有?

1 个答案:

答案 0 :(得分:1)

对于您的ERP-DB,您仍然可以使用Code first方法来处理现有数据库,但是您需要使用自己的映射配置,您可以在其中更改目标表的名称,列等。article表,合适的解决方案似乎是基于TPH方法模拟你的层次结构:

http://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy

所以对你而言,它意味着创建抽象基类article然后创建类transmitter等,然后通过流畅的API创建映射。当然,您的article表中必须有一个合适的鉴别列。

  

所以我的TransmitterRepository应该有一个方法,知道如何检索发送器或者我应该把这个逻辑放在哪里?

是的,这是一个标准案例。您的存储库有一些FindById方法。

  

但我在那里“赢”了什么?

这对您来说意味着更少的编码,因为您将不再拥有任何数据实体并在您的存储库中映射到它们之间的域实体。