Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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中DTO(数据传输对象)和代理对象的区别#_C#_Entity Framework - Fatal编程技术网

C# c中DTO(数据传输对象)和代理对象的区别#

C# c中DTO(数据传输对象)和代理对象的区别#,c#,entity-framework,C#,Entity Framework,在实体框架中,这两个术语用于DTO和代理对象。如果使用DTO传输状态,我会感到困惑,那么为什么要使用此代理对象?代理对象是从模型类继承的对象,但添加了一些功能,如状态管理。这通常用于使您的模型不必从任何特殊类继承 数据传输对象不是来自模型的对象,但它们表示相同的数据。您通常使用它们与不知道您的模型的服务进行通信。DTO和代理对象不是EF概念,而是一般概念 DTO或“数据传输对象”是专门为在应用程序的层或服务之间移动数据而创建的对象。使用DTO有几个原因,但大多数情况下是层或服务之间所需的信息在层

在实体框架中,这两个术语用于DTO和代理对象。如果使用DTO传输状态,我会感到困惑,那么为什么要使用此代理对象?

代理对象是从模型类继承的对象,但添加了一些功能,如状态管理。这通常用于使您的模型不必从任何特殊类继承


数据传输对象不是来自模型的对象,但它们表示相同的数据。您通常使用它们与不知道您的模型的服务进行通信。

DTO和代理对象不是EF概念,而是一般概念

DTO或“数据传输对象”是专门为在应用程序的层或服务之间移动数据而创建的对象。使用DTO有几个原因,但大多数情况下是层或服务之间所需的信息在层或服务端之间不同。例如:

  • 您有一个具有许多属性的实体,而服务客户端或另一层只需要其中的一些属性:使用所需的属性创建DTO,将原始属性从原始实体映射到DTO,并在服务/层上公开DTO

  • 您需要公开具有来自不同实体的属性的对象:创建具有所有必需属性的DTO,将实体中的属性映射到DTO并公开它。例如,您可能需要一个平面对象,该对象具有EF实体的属性和与其相关的“主表”(例如,与FK关联的描述或名称)

  • 您需要公开具有不同形状、聚合数据或任何其他更改的实体

可以通过多种方式实现映射:例如,创建一个DTO构造函数,该构造函数接受原始实体作为参数,创建一个静态类,使用静态方法进行映射。您可以使用或之类的工具使映射变得更容易一些。有时,您甚至可以直接使用它们,而无需实现任何其他东西来进行映射。但是,如果映射有点复杂,通常必须手动进行一些映射

代理对象是完全不同的。Literaly是表示另一个对象的对象。即,与原始对象基本相同但不同的对象。这样做通常是为了向对象添加额外的功能,使其与原始意图兼容。例如,可以代理一个对象来拦截登录或验证的方法调用。通常的技术是使用一个从原始对象动态继承的框架,并加载所需的行为(这是典型的)

在实体框架的情况下,可以找到“更改跟踪代理”的代理。这些是从原始实体动态继承创建的对象,但添加了一些功能,允许它们跟踪其更改:它们可以保存原始值、更改的值、新状态等,还允许它们实现延迟加载。
因为它们是原始对象的子类,所以它们具有相同的属性,但行为不同

您阅读此
ProxyObject
的上下文是什么?顺便说一下,您真的不应该将DTO与EF一起使用。实际上,我使用的是webmodel,并使用automapper将webmodel映射到entity类。然后,当我保存实体时,我如何能够从映射到实体的web模型中获取生成的id(自动递增)?