我正在开发一个适用于2个DB的应用程序。我想使用 EF,Repository和UnitOfWork 模式。我正在学习干净的代码原则和设计模式,所以想得到一些反馈,因为虽然我(想)理解了主要的想法,但我在实现中有点挣扎。我已经提到了很多答案和文章,但仍然无法完全将这些想法引入我的具体问题。
我有2个DB。
首先,如果我理解为ERP-DB,我应该使用DBFirst方法,因为我无法修改数据库,而对于项目数据库,我可以使用任何人,因为CodeFirst可能是最好的方法(因为我我试图做DDD)所以我可以先设计我的域模型,然后定义将持久化的内容。
现在有一个问题:
ERP-DB非常通用"并且例如有一个表"文章"。在这里,您可以找到我们拥有的任何类型的文章,从完整的构建设备到装配件。
因此,对于DBFirst,EF为其生成一个名为" Articles"的实体。但是我不想在我的域模型中使用这样的类,我希望更好的类如transmitter
,termometer
,measureCell
等等。它们是"具体& #34;文章。所以我需要将Articles
映射到不同的域对象。
article
,即transmitter
具有measureCell
,两个实体位于同一articles
表中。那么我的TransmitterRepository
应该有一个方法,知道如何检索变送器或者我应该把这个逻辑放在哪里?现在,关于project-DB,我可以使用CodeFirst专注于我的域模型并定义需要持久化的内容。因此,如果我选择这种方法并正确理解它,我可以直接将我的数据实体映射到我的域对象。但是我完全不了解它,因为对我来说,我只是在其他地方使用相同的逻辑,而不是在repos中将它直接放在我的对象中,但是我和#34; win"有?
答案 0 :(得分:1)
对于您的ERP-DB,您仍然可以使用Code first方法来处理现有数据库,但是您需要使用自己的映射配置,您可以在其中更改目标表的名称,列等。article
表,合适的解决方案似乎是基于TPH方法模拟你的层次结构:
http://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy
所以对你而言,它意味着创建抽象基类article
然后创建类transmitter
等,然后通过流畅的API创建映射。当然,您的article
表中必须有一个合适的鉴别列。
所以我的TransmitterRepository应该有一个方法,知道如何检索发送器或者我应该把这个逻辑放在哪里?
是的,这是一个标准案例。您的存储库有一些FindById
方法。
但我在那里“赢”了什么?
这对您来说意味着更少的编码,因为您将不再拥有任何数据实体并在您的存储库中映射到它们之间的域实体。