Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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/8/design-patterns/2.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# Data Transfer对象中的属性应该扩展外键还是仅仅公开其主键_C#_Design Patterns_Data Transfer Objects - Fatal编程技术网

C# Data Transfer对象中的属性应该扩展外键还是仅仅公开其主键

C# Data Transfer对象中的属性应该扩展外键还是仅仅公开其主键,c#,design-patterns,data-transfer-objects,C#,Design Patterns,Data Transfer Objects,我有一个EmployeeDTO,它在数据库中响应员工记录。Employee表与部门有关系,与权限有1对多关系 在“我的实体”中,这些实体表示为完全展开的部门属性和完全展开的权限对象列表 问题是DTO是否应该具有DepartmentId的完全扩展DepartmentDTO属性?DTO是否应该有一个完全扩展的PermissionDTO属性列表PermissionId列表?是和否。这取决于通话以及每次通话是否需要所有额外属性。它还可能取决于您使用的ORM技术,该技术可以实现延迟加载,并可能影响您的决策

我有一个EmployeeDTO,它在数据库中响应员工记录。Employee表与部门有关系,与权限有1对多关系

在“我的实体”中,这些实体表示为完全展开的部门属性和完全展开的权限对象列表


问题是DTO是否应该具有DepartmentId的完全扩展DepartmentDTO属性?DTO是否应该有一个完全扩展的PermissionDTO属性列表PermissionId列表?

是和否。这取决于通话以及每次通话是否需要所有额外属性。它还可能取决于您使用的ORM技术,该技术可以实现延迟加载,并可能影响您的决策(如果您传递的是直线实体对象,尽管不建议这样做)


创建一个包含所有必要属性的案例DTO和一个或多个公开更多功能并用于其他方法的DTO对象是很常见的。例如,我有一个
BasicUser
类,它只包含
UserName
DisplayName
,我有
User
,它包含更多的内容,包括
权限
继承自`BasicUser.

就像设计中的一切一样,它取决于您的需要

  • 如果您需要经常查看和 绑定到子属性,您需要 尽可能地简化 开发人员要使用DTO,您可以 想要显式的工厂方法来提供 您完全扩展了子属性
  • 如果您想要代码的简单性,请不要 展开外键属性和 让开发者得到孩子 按键列出所需的对象/集合 根据需要
您可能会在递归中遇到问题;是否也展开Department对象的所有外键属性?如果在部门的子类中引用了另一个EmployeeDTO怎么办


微软的实体框架,以及其他流行的业务对象框架,通过延迟加载来处理这个概念——只有在代码调用完整扩展的子属性时才能获取它。这可能是最灵活的解决方案,但有一点开销/延迟,因为子属性不能在与父对象相同的数据库调用中获取。这些当然不是纯粹的DTO。

是的,如果您想要完全扩展子属性,如何处理递归问题?如果DTO相互引用,那么您将在很长一段时间内保持扩展。所以在编写DTO类时,我只存储其他DTO的唯一id,而不存储整个其他DTO本身?