【问题标题】:Mapping Database-First EF6 Entities to Domain Model Entities将数据库优先的 EF6 实体映射到域模型实体
【发布时间】:2014-05-08 02:36:55
【问题描述】:

我们目前有一个生命周期很长的项目,其中数据层实体被用作域模型实体,这显然让我们在多年扩展后感到有些悲伤。我们中的一小部分人的任务是从根本上重写应用程序的框架,然后我们将逐步过渡到该框架。

我们的第一个决定是确保我们的域实体不基于数据库。相反,我们与企业主进行了沟通,并按照通用语言原则构建了我们的对象。域模型代码现已全部完成,我们对此相当满意。

现在这是问题的症结所在。我们正在使用 Microsoft Entity Framework 6 使用数据库优先来生成我们的数据层,因为在所有内容都迁移到新架构之前,我们无法开始将数据库更改为代码优先,并且我们需要数据库中的数据。所以我们计划做的是将我们的域实体映射到 EF6 实体(反之亦然)。

我的第一个想法是使用 AutoMapper 在存储库实现中来回映射,但我觉得我缺少一些简单的东西,或者 Entity Framework 6 中的一些我没有使用或误用的功能解决这个问题。我觉得我们不可能是唯一遭受这种情况的群体。

谁能提供一些关于我们可以做些什么来解决这个问题的见解?需要注意的是,我们坚持不包括上下文或任何与我们的域模型相关的数据层,包括工作单元。我们使用 Autofac 作为我们的 DI 容器,并且多个应用程序使用我们的域模型。

【问题讨论】:

    标签: entity-framework architecture domain-driven-design automapper entity-framework-6


    【解决方案1】:

    如果没有从长远来看可能会咬你的变通办法,正确封装的域对象将无法工作(ORM 和 doc db 都没有)。最干净但很好......无聊的解决方案是使用纪念品来保持持久性。

    域对象将提供纪念品并使用纪念品来恢复自身。持久性只适用于那个纪念品,你可以用它做任何你想做的事情,因为它是一个 DTO。

    同时,如果您还没有这样做,我建议您使用 CQRS(可能还有 Event Sourcing)。在这两种情况下,您将有一个供域使用的写入模型和至少一个读取模型模型供其他人使用。它肯定需要更多代码,但从长远来看,它会简化事情,因为您将始终使用专用于单一目的的模型,而不是使用一个模型来处理所有事情。

    关于工作单元,通过领域事件和 sagas 对流程进行建模。您必须处理最终的一致性(心理问题)和幂等性(技术问题),但您的应用将非常灵活且可维护。

    【讨论】:

    • 在阅读了您的答案并对 CQRS 及其使用 Entity Framework 的实现模式进行了大量阅读之后,这绝对看起来像是要走的路。它确实添加了更多代码,但从长远来看它会更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多