1

我正在使用2个DB工作的应用程序。我想使用EF,Repository和UnitOfWork模式。我正在学习干净的代码原则和设计模式,所以想要得到一些反馈,因为虽然我(认为)理解了主要想法,但我在实现中遇到了一些困难。我收集了很多答案和文章,但仍然无法完全将这些想法带入我的具体问题。实体框架,存储库模式和2个数据库

我有2个DB。

  1. 我们的ERP系统的遗留数据库。只读访问(又名ERP-DB)。从这个数据库我必须采取我需要的所有信息。
  2. Project-DB。需要创建,对此我没有任何限制。 (又名项目-DB

因此,首先,如果我的理解是正确的ERP-DB我应该使用DBFirst的方法,因为我不能修改数据库和项目数据库,我可以用任何人,作为CodeFirst也许是最好的方法(因为我试图做DDD),所以我可以先设计我的领域模型,然后定义将持续的东西。

现在的1个问题:

  • 的ERP-DB是很 “一般”,有例如一表 “的文章”。在这里你可以找到任何类型的文章,从完整的构建设备到装配件。 因此,对于DBFirst,EF为其生成一个名为“Articles”的实体。但我不想在我的领域模型中使用这样的类,我想要更好的类如transmitter,termometer,measureCell等。它们是“特定”的文章。所以我需要将Articles映射到不同的域对象。

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

,关于该项目-DB,我可以用CodeFirst专注于我的域模型,并确定需要保留什么。所以,如果我选择这种方法并理解它,我可以直接将我的数据实体映射到我的域对象。但是我不完全理解它,因为对于我来说,我只是将相同的逻辑放在其他地方,而不是在回购中使用它,而是直接在我的对象中使用它,但是我在那里“赢”了什么?

+0

您可以[先对现有数据库进行编码](https://msdn.microsoft.com/en-us/library/jj200620(v = vs.113).aspx)。我不明白你最后的问题。 EF简单地说就是已经实现了工作单元模式的对象关系映射器。关于是否使用存储库,首先编写代码和首先编写数据库等进行了大量的讨论和讨论。 –

回答

1

对于您的ERP-DB,您仍然可以对现有数据库使用Code first方法,但是您需要带上自己的映射配置,在其中更改目标表,列等的名称。在article表的情况下,合适的解决方案似乎是基于TPH方法你hiearchy模型:

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

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

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

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

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

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