C# 三层实体框架应用程序中的DTO

C# 三层实体框架应用程序中的DTO,c#,entity-framework,architecture,dto,C#,Entity Framework,Architecture,Dto,我正在构建两个C#三层应用程序,它们从一个非常古老的数据库客户表中获取数据,该表大约有100列。它们在业务层执行一些逻辑,表示层显示数据 客户表的布局为- CustomerID Firstname Lastname DateOfBirth Othervalue1 Othervalue2 Othervalue3 . . Othervalue95 Creationdate Updatedate 对于这两个应用程序,我只需要customer表,但我正在使用实体框架构建一个新的数据访问层。未来的项目将

我正在构建两个C#三层应用程序,它们从一个非常古老的数据库客户表中获取数据,该表大约有100列。它们在业务层执行一些逻辑,表示层显示数据

客户表的布局为-

CustomerID
Firstname
Lastname
DateOfBirth
Othervalue1
Othervalue2
Othervalue3
.
.
Othervalue95
Creationdate
Updatedate
对于这两个应用程序,我只需要customer表,但我正在使用实体框架构建一个新的数据访问层。未来的项目将需要访问其他表,并将添加到此访问层

我将使用工作单元和存储库模式

我的问题是:

应用程序A需要客户表列的一个子集

应用程序B需要客户表列的不同子集(与应用程序a的需求有些重叠)

如何执行从数据层到这两个独立业务层的映射?我知道我可以使用automapper执行从数据实体类到业务层类的映射,但我将有两个不同的业务层客户类


我已经读了一些关于DTO的文章,但我不认为在这个n层应用程序中应该有什么进展

根据您的应用程序设计,您可以使用其中任何一种
1-将客户表映射到两个或多个实体
2-有一个基本实体(如CustomerBase)和2个或更多子实体
3-DTO是数据传输对象,它们(通常)是可变的。更改它们不会导致数据库上的CRUD操作。
DTO用于以下场景:客户实体是一个重量级对象(比如100列),而您只需要该数据的子集(比如20列)。 DTO对象和实际实体之间的转换可以通过许多方式实现,如自动映射器、手动加载和更多


希望这有帮助

您可以根据您的应用程序设计使用其中任何一种
1-将客户表映射到两个或多个实体
2-有一个基本实体(如CustomerBase)和2个或更多子实体
3-DTO是数据传输对象,它们(通常)是可变的。更改它们不会导致数据库上的CRUD操作。
DTO用于以下场景:客户实体是一个重量级对象(比如100列),而您只需要该数据的子集(比如20列)。 DTO对象和实际实体之间的转换可以通过许多方式实现,如自动映射器、手动加载和更多

希望这有帮助

以下是我要做的:

在应用程序A中-提取所需的数据,并将其映射到新类(DTO) 对应用程序B执行同样的操作

如果这两个应用程序之间除了共享af数据库之外没有其他关系,则不应执行其他操作。也就是说:保持应用程序A对应用程序B的无电源,反之亦然

DTO只是跨n层应用程序共享对象的一个花哨名称

下面是我要做的:

在应用程序A中-提取所需的数据,并将其映射到新类(DTO) 对应用程序B执行同样的操作

如果这两个应用程序之间除了共享af数据库之外没有其他关系,则不应执行其他操作。也就是说:保持应用程序A对应用程序B的无电源,反之亦然


DTO只是跨n层应用程序共享对象的一个花哨名称

您可以使用IOC并将相关映射器注入到数据层中

您需要使用UoW和存储库模式吗?
EF是一种数据访问抽象,其本身具有工作单元。您可以访问业务层中的DBContext,并使用Linq将数据投影到DTO中。

您可以使用IOC并将相关映射器注入数据层

您需要使用UoW和存储库模式吗?
EF是一种数据访问抽象,其本身具有工作单元。您可以访问业务层中的DBContext,并使用Linq将数据投影到DTO中。

您需要对旧系统进行只读访问吗

在这种情况下,我建议在每个应用程序上使用一个,并在两个不同的实体框架模型上只映射所需的列

如果您还需要编写它,那么可能很困难,您必须映射所有列


如果希望使用单个实体框架模型,则可以使用DTO映射数据子集。在这种情况下,自动映射器是一个很好的解决方案。

在旧系统上是否需要只读访问

在这种情况下,我建议在每个应用程序上使用一个,并在两个不同的实体框架模型上只映射所需的列

如果您还需要编写它,那么可能很困难,您必须映射所有列


如果希望使用单个实体框架模型,则可以使用DTO映射数据子集。在这种情况下,auto mapper可能是一个很好的解决方案。

如果我将DBContext添加到业务层,我是否会编程到一个实现中,并将业务层和数据层耦合起来?就像使用IoC注入映射器的建议一样。是的,这并不理想,但我在规范化关系数据库的基础上与存储库进行斗争,最终还是在某个地方找到了IQueryable!不过,国际奥委会的解决方案对你来说应该很好。祝你好运。如果我将DBContext添加到我的业务层,我是否会编程到一个实现中,并将业务层和数据层耦合起来?就像使用IoC注入映射器的建议一样。是的,这并不理想,但我在规范化关系数据库的基础上与存储库进行斗争,最终还是在某个地方找到了IQueryable!不过,国际奥委会的解决方案对你来说应该很好。祝你好运。我将阅读有关反腐败层的文章。关于DTO的使用-它们应该位于我的层中的何处?@tom它们是域类,因此它们位于域层中。我通常使用实体定义、DTO、枚举和存储库接口(或其他基本服务接口)创建xyz.domain程序集,