我有一个WCF服务,它通过Linq2SQL检索数据。我得到所有的儿童记录,而不是相关的父记录
即客户记录具有相关订单,并且客户处于状态。我收到客户和订单,但我无法获得状态记录以获取状态描述
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 );
}
我尝试过使用延迟加载和对象跟踪(我不需要)并且没有想法。
任何人都可以帮助我如何退回客户状态记录。
答案 0 :(得分:0)
这并没有真正回答这个问题(我知道这很烦人!)但也许最好在数据合同中定义自定义对象并手动填充它们以便传递服务。这样,如果您更改Linq2Sql模型,则不会破坏您的WCF客户端。
此外,这并不像听起来那么长。在Linq2SQL中,你可以像..
from c in context.Customers
where (...)
select new CustomerStatusRecord() { CustomerId = c.Id, Status = c.CustomerStatus.Status ... }
CustomerId和Status是新定义的数据合同中的字段。
这种解耦方法是我的首选方法,但我理解为什么为方便起见,它更容易通过服务传递整个数据上下文对象。
最后想到:如果您将来在客户表中添加了50多个新字段,使用您所描述的方式将真正增加您服务中的数据传输。但是,如果它解耦,你就可以绝对控制电线上的内容。如果您保留原样,可能最终会传递敏感数据。
答案 1 :(得分:0)
我发现它是什么! Linq to SQL将[DataMember()]属性放在子记录上,但不是父母。我不得不在关联下添加[DataMember()]属性。
Down Side是这是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
{
...
}
}