WCF RIA 服务中的 DTO 主从
-
12-11-2019 - |
题
我必须制作一个主细节场景,在主场景中我可以显示多种类型的项目,它们都实现了 IDto
:
interface IDto
{
int Id { get; set; }
string Title { get; set; }
EntityType { get; set;
}
enum EntityType
{
Contact,
Person,
Company,
Customer
Employee,
Vendor,
Job
}
笔记:我正在使用实体框架 EDM(生成 ObjectContext
和 EntityObject
s)。
类层次结构是这样的 Contact
是子类 Person
和 Company
, Person
是的基类 Employee
, Company
是的基类 Vendor
. Customer
有财产 Contact
这可以是 Contact
或一个 Person
, ,并有一个列表 Job
.
现在在主列表中,我想从以下位置加载 DTO 集合: DomainService
(它是 LinqToEntitiesDomainService<ObjectContext>
, ,我只想要指定的字段 IDto
选择合同,然后在选择时加载整个实体及其所有字段/相关数据等。在详细信息区域。
更新:我想到了另一个主意。
创建一个返回上述 3 行的数据库视图 (SQL2008) IDto
合同,其中枚举将存储为 int 或 tinyint (然后将枚举更改为字节),然后在 edm 中,我可以为列表中存储的每个 EntityType 创建一个每个层次结构表,并从 DomainService
.
顺便说一句,所有枚举值都将用于查询,实际上,没有实体会返回 Contact
为其 EntityType
财产,因为 Contact
是抽象的,可以是 Person
或一个 Company
, ,但我仍然希望有一个选项来查询它们两个。
更新2
对于列表中的每一项,客户还希望获得其所有作业。
基于我上面描述的层次结构,对于 Customer
- 选择其所有作业;为一个 Contact
或一个 Person
- 选择它的 Customer
的 Job
s(如果它是 Customer
). Vendor
或者 Employee
s 并不意味着要注册 Job
s。
我认为我能做到这一点的唯一方法是使用数据库视图。
我错了吗?后果是什么?我正在使用 SL5 和 RIA。
景色好吗?或者我应该使用客户端 POCO 处理客户端中的所有查询?因为实际上这个值仅用于检索联系人姓名及其职位。进一步的细节和操作将在其他视图中完成 Entity
实体本身。
那么各位专家怎么看呢?
解决方案
我发现了 这 帖子非常有用,它实际上让我做出了决定。
- 数据库视图不一定是正确的方法
- 将通过 POCO DTO 从域服务返回部分实体。