问题是我有一个默认配置的Odata服务:
public class Service : DataService<SummumnetFilterContext>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
protected override SummumnetFilterContext CreateDataSource()
{
var dataSource = new SummumnetFilterContext();
dataSource.Configuration.ProxyCreationEnabled = false;
return dataSource;
}
}
有几个具有这种结构的表:
public class LabTest
{
public int ID { get; set; }
public DateTime ApplicationDate { get; set; }
public DateTime ReportDate { get; set; }
public virtual List<LabValue> LabValue { get; set; }
}
public class LabValue
{
[Required]
public int ID { get; set; }
public string Value { get; set; }
public string Units { get; set; }
public int LabTestID { get; set; }
public virtual LabTest LabTest { get; set; }
}
问题是,当我尝试使用它的LabValue,使用Odata时,List<LabValue> LabValues
每次都是空的,不是空的,而是空的。谁能帮我这个?。在我的服务中使用EF ofcourse。
答案 0 :(得分:7)
我猜您正在使用WCF数据服务来使用您的OData Feed。在这种情况下you must tell the service,您希望将您的关系与主实体一起加载:
var data = dataServiceContext.LabTests.Expand("LabValues").FirstOrDefault();
如果您通过网址手动调用数据服务,则必须使用expand
query option。
要说清楚 - 服务没有透明的延迟加载。延迟加载是直接使用当前EF上下文范围内同一层上的实体时使用的EF功能。当您使用OData源时,您很可能不在同一层(甚至是机器)上,并且不提供透明的延迟加载以避免额外的网络往返服务。