Linq-to-SQL和WCF服务-数据传输对象
本文关键字:数据传输 对象 服务 WCF Linq-to-SQL | 更新日期: 2023-09-27 18:18:40
我对使用Linq-to-SQL和WCF服务开发n层应用程序的最佳实践很好奇。
例如,我特别感兴趣的是如何从两个相关的表返回到表示层数据。假设下一种情况(非常简化):数据库中有表:
-
Orders
(id, OrderName
)
OrderDetails
( id, orderid, DetailName
)中间层有OrderDetails
的CRUD方法。所以,我需要有一种方法来重建实体,以便在它从表示层返回时附加到上下文进行更新或插入。
在表示层,我需要显示OrderDetails
的列表和相应的OrderName
从父表
从服务返回的类有两种方法:
使用DTO自定义类封装来自表和投影的数据:
class OrderDetailDTO { public int Id { get; set; } public string DetailName { get; set; } public string OrderName { get; set; } } IEnumerable<OrderDetailDTO> GetOrderDetails() { var db = new LinqDataContext(); return (from od in db.OrderDetails select new OrderDetailDTO { Id = od.id, DetailName = od.DetailName, OrderName = od.Order.OrderName }).ToList(); }
缺点:需要分配每个字段,这对于表示层在两个方面都很重要(当返回数据时,当创建新实体以附加到上下文时,当数据从表示层返回时)
使用定制的Linq-to-SQL实体部分类:
partial class OrderDetail { [DataMember] public string OrderName { get { return this.Order.OrderName // return value from related entity } set {} } } IEnumerable<OrderDetail> GetOrderDetails() { var db = new LinqDataContext(); var loadOptions = new DataLoadOptions(); loadOptions.LoadWith<OrderDetail>(item => item.Order); db.LoadOptions = options; return (from od in db.OrderDetails select od).ToList(); }
缺点:数据库查询将包括Orders
表中的所有列,Linq-to-SQL将实现整个Order实体,尽管我只需要其中的一个字段。
很抱歉,说了这么长。也许我错过了什么?
我会说使用DTO和Automapper,将DB实体作为数据契约公开不是一个好主意
您是否需要使用Linq to SQL,或者您仍处于可以选择技术的设计阶段?如果是最新的,我建议使用带有自我跟踪实体(STE)的实体框架。然后,当您从客户端返回实体时,所有客户端更改将由ste自动为您处理,您只需调用Save。包括相关实体也很容易:(...some query...).Orders.Include(c => c.OrderDetails)