【问题标题】:Linq-to-SQL and WCF service - data transfer objectsLinq-to-SQL 和 WCF 服务 - 数据传输对象
【发布时间】:2012-01-26 00:09:42
【问题描述】:

我很好奇使用 Linq-to-SQL 和 WCF 服务开发 n 层应用程序时的最佳实践。

我特别感兴趣,例如,如何从两个相关表返回表示层数据。假设下一种情况(非常简化):

数据库有表:

  • Orders (id, OrderName)
  • OrderDetails (id, orderid, DetailName)

中间层具有OrderDetails 的 CRUD 方法。所以,我需要有办法重建实体,以便在它从表示层返回时附加到上下文以进行更新或插入。

在表示层中,我需要显示OrderDetails 的列表以及父表中对应的OrderName

从服务返回的类有两种方法:

  1. 使用 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();
    }
    

    缺点:需要以两种方式分配对表示层很重要的 every 字段(返回数据时以及创建新实体以附加到上下文时,当数据从表示层返回时)

  2. 使用自定义的 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 实体,尽管我只需要其中一个字段。

对不起,这么长的故事。可能是我错过了什么?将不胜感激任何建议。

【问题讨论】:

    标签: c# wcf linq-to-sql dto


    【解决方案1】:

    我会说使用 DTO 和 Automapper,将 DB 实体公开为数据合同不是一个好主意

    【讨论】:

    • 为什么不选择 EF?很有趣
    【解决方案2】:

    您是否需要使用 Linq to SQL,或者您仍处于可以选择技术的设计阶段?如果是最新的,我建议使用带有自我跟踪实体 (STE) 的实体框架。当您从客户端取回实体时,STE 将自动为您处理所有客户端更改,您只需调用 Save。包括相关实体也很容易:(...some query...).Orders.Include(c =&gt; c.OrderDetails)

    【讨论】:

    • 不幸的是,我正处于开发阶段。我正在考虑迁移到 EF,但由于时间限制,暂时没有选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2013-10-27
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多