Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理域和代码优先实体之间的不匹配_C#_Entity Framework_Ef Code First_Separation Of Concerns - Fatal编程技术网

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

C# 处理域和代码优先实体之间的不匹配,c#,entity-framework,ef-code-first,separation-of-concerns,C#,Entity Framework,Ef Code First,Separation Of Concerns,我使用的是代码优先方法,代码优先方法的模型(DAL)和域模型(BLL)之间存在一些不匹配。我想象我的数据模型中只有注释、属性、配置等与数据库相关,而域模型实体中的注释、属性、配置等与域模型实体不同,反之亦然,以遵循关注点分离 我如何在我的申请中处理这种情况?我想这比技术上更符合逻辑。很多地方都曾问过,但还没有具体的线索。希望SO的建议能有所帮助。我会选择AutoMapper。它可以帮助您减少从一个对象转换到另一个对象所需的样板代码 你可以在这里找到它: 编辑: 将您的域模型放在BLL或单独的项

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


我如何在我的申请中处理这种情况?我想这比技术上更符合逻辑。很多地方都曾问过,但还没有具体的线索。希望SO的建议能有所帮助。

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

你可以在这里找到它:

编辑:

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

您通常有:

  • 域模型(实体),这是O/RM(实体框架)使用的
  • 数据传输对象(DTO)模型,用于将数据发送到视图(在MVC中)或通过web服务等
我同意Andras的观点:从一个(域)到另一个(DTO)的最佳方式是使用Automapper。当然,你也可以手工做。
您需要意识到的一点是,域和DTO之间不需要1-1映射,DTO也可以包含非规范化或计算属性。

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

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

关于分离:我们只使用域项目和Persistence.EntityFramework项目,后者包含所有映射,因此域根本不引用EntityFramework.dll


如果您有一些特定的映射问题,例如您提到的那些问题,这就是您创建两个层(一个是DAL层,另一个是BL层)的原因,请询问他们。

就像我说的,我的域模型/业务逻辑可能与表示我的代码优先DB方法的模型没有1:1映射。AFAIK DTO可能关注UI层(Web、API等),但正如我前面所述,我正在尝试将DAL和BLL解耦。我的问题是如何而不是什么。你能链接到一个详细讨论这个问题的样本或文章吗?是的。我想这是一种方法。我希望业务模型/逻辑应该独立于任何东西。这不会在我的BLL中添加依赖项吗?不会。如果将域模型放在BLL中,那么只有DAL将依赖于BLL。在我看来,在一个新项目中分离模型甚至更好,因为您不必参考BLL,只需参考模型。谢谢。我想我现在会走这条路,如果我有任何映射问题,我会在你的博客上问你:)我很高兴我能帮助你,如果你有任何问题,就直接问我:)