我正在开发一些由利用实体框架的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"
现在,客户端可能希望显示系统中所有窗口小部件的列表,因此请求服务中的所有窗口小部件列表,但仅请求ID
和Name
字段。
第一个问题:在这种情况下,如何向客户端发送稀疏DTO?我知道DataMembers在DataContracts中可以是可选的,但是我不确定代码的初始化是什么样的。只需填写要求的字段?
现在说UI中的Name
字段是可编辑的,用户可以更改xxx小部件的名称。客户端从发送的服务中触发更新:
ID = "xxx"
Name = "a new name"
此时,我希望能够检测到只有Name
字段已更改,并在DAL内触发实体更新。 下一个问题是:如何判断客户端是否发送了仅指定了ID
和Name
字段的DTO?
答案 0 :(得分:1)
我决定做的是为所有原始字段创建具有可空类型的DTO。这样,当DTO从客户端请求进入时,代码可以检查NULL。如果为NULL,则客户端未指定该字段。否则,获取值并在EF上的Entity实例上设置它,并让数据库上下文找出已更改的内容...