代码之家  ›  专栏  ›  技术社区  ›  Traci

WCF Linq2SQL不返回“父”对象

  •  1
  • Traci  · 技术社区  · 14 年前

    我有一个通过Linq2SQL检索数据的WCF服务。我得到所有的孩子记录,只是没有相关的家长记录

    i、 e客户记录有相关的订单,并且客户上有一个状态。我正在获取客户和订单,但无法获取状态记录以获取状态描述

     using (MyDataContext context = new MyDataContext(CommonCode.DBConnectionString))
            {
                context.DeferredLoadingEnabled = false;
                DataLoadOptions options = new DataLoadOptions();
                options.LoadWith<Customer>(u => u.Orders);
                options.LoadWith<Customer>(u => u.CustomerStatus);
    
                context.LoadOptions = options; 
                context.ObjectTrackingEnabled = false; // retrieving data read only
    
                return context.Customers.SingleOrDefault<Customer>(
                    cus=> cus.CustomerId == passedId );
            }
    

    我尝试过延迟加载和对象跟踪(我不需要在上面),但已经没有什么想法了。

    2 回复  |  直到 9 年前
        1
  •  0
  •   Remotec    14 年前

    这并不能真正回答问题(我知道这很烦人!)但是,最好在数据协定中定义自定义对象,并手动填充它们以传递服务。这样,如果您更改Linq2Sql模型,就不会破坏WCF客户机。

    此外,这并不像听起来那么冗长。在Linq2SQL中,您可以执行以下操作。。

    from c in context.Customers
    where (...)
    select new CustomerStatusRecord() { CustomerId = c.Id, Status = c.CustomerStatus.Status ... }
    

    CustomerId和Status是新定义的数据协定中的字段。

    最后一个想法:如果您将来在customer表中添加50多个新字段,那么使用您所描述的方法将真正增加整个服务的数据传输。但是,如果它是解耦的,你就可以绝对控制通过电线的东西。如果你让它保持原样,也许你最终会把敏感数据传给别人。

        2
  •  0
  •   Traci    14 年前

    我知道是什么了!linqtosql将把[DataMember()]属性放在子记录上,而不是放在父记录上。我必须在关联下添加[DataMember()]属性。

    缺点是,这是对context.designer.cs的手动输入,如果dbml发生更改,它将被覆盖:-(

        [Association(Name="CustomerStatus_Customer", Storage="_CustomerStatus", ThisKey="CustomerStatusId", OtherKey="CustomerStatusId", IsForeignKey=true)]
        [DataMember()]
        public CustomerStatus CustomerStatus
        {
            get
            {
                return this._CustomerStatus.Entity;
            }
            set
            { 
              ...
             }
         }