处理领域和代码优先实体之间的不匹配

本文关键字:实体 之间 不匹配 代码 处理 | 更新日期: 2023-09-27 18:04:56

我正在使用代码优先方法,我的代码优先方法(DAL)模型和我的领域模型(BLL)之间存在一些不匹配。我设想我的数据模型只具有与数据库相关的注释、属性、配置等,而与我的领域模型实体不同,反之亦然,以遵守关注点分离。

在我的应用程序中如何处理这种情况?我想这更符合逻辑而不是技术。很多地方都问过,但还没有具体的线索。

处理领域和代码优先实体之间的不匹配

根据我的经验,由于实体框架的丰富映射可能性,您根本不必将数据访问层和业务逻辑层分开,您只需要使用实体框架的Fluent API。在我当前的一个项目中,我们有超过150个具有继承层次结构的类,但我们仍然可以在不"复制"对象的情况下使用它。

关于fluent API的一些很好的介绍可以在这里找到:

http://msdn.microsoft.com/en-us/data/hh134698.aspx

http://msdn.microsoft.com/en-us/magazine/hh852588.aspx

关于分离:我们简单地使用一个Domain项目和一个Persistence。EntityFramework项目,后者包含所有映射,因此Domain根本不引用EntityFramework.dll。

如果你有一些特定的映射问题,例如你提到的那些你创建两个层的原因,一个为DAL,另一个为BL,直接问他们。

我会选择AutoMapper。它可以帮助您减少从一个对象转换为另一个对象所需的样板代码。

你可以在这里找到它:https://github.com/AutoMapper/AutoMapper

编辑:

将您的领域模型放在BLL或单独的项目中,在DAL中添加对BLL或该单独项目的引用(也在BLL中引用新项目),并在DAL中使用AutoMapper。所以只有领域模型才会离开DAL。

通常有:

  • 领域模型(实体),这是O/RM(实体框架)使用的;
  • 数据传输对象(DTO)模型,用于向视图(在MVC中)或web服务等发送数据。

我同意Andras的观点:从一个(域)到另一个(DTO)的最好方法是使用Automapper。当然,你也可以手工做。您需要认识到的一件事是,在域和DTO之间不需要1-1映射,DTO也可以包含非规范化或计算的属性。