如何创建和检测稀疏DTO中的更改?

时间:2013-04-05 15:31:28

标签: .net wcf entity-framework dto

我正在开发一些由利用实体框架的DAL支持的WCF服务。客户端,服务和DAL通过WCF数据协定形式的数据传输对象(DTO)相互通信。 (来自EF的Entity对象封装在DAL中。)

为了最大限度地减少线路上的数据量,我想支持稀疏DTO的传输 - 这是对象中总字段的一个子集。

例如,假设我有这样的DTO:

public class widget
{
   public string ID { get; set; }
   public string Name { get; set: }
   public int Amount { get; set; }
   public string Color { get; set; }
}

说对象的原始状态是:

ID = "xxx"
Name = "flux capacitor"
Amount = 42
Color = "purple"

现在,客户端可能希望显示系统中所有窗口小部件的列表,因此请求服务中的所有窗口小部件列表,但仅请求IDName字段。

第一个问题:在这种情况下,如何向客户端发送稀疏DTO?我知道DataMembers在DataContracts中可以是可选的,但是我不确定代码的初始化是什么样的。只需填写要求的字段?

现在说UI中的Name字段是可编辑的,用户可以更改xxx小部件的名称。客户端从发送的服务中触发更新:

ID = "xxx"
Name = "a new name"

此时,我希望能够检测到只有Name字段已更改,并在DAL内触发实体更新。 下一个问题是:如何判断客户端是否发送了仅指定了IDName字段的DTO?

1 个答案:

答案 0 :(得分:1)

我决定做的是为所有原始字段创建具有可空类型的DTO。这样,当DTO从客户端请求进入时,代码可以检查NULL。如果为NULL,则客户端未指定该字段。否则,获取值并在EF上的Entity实例上设置它,并让数据库上下文找出已更改的内容...