的OData问题与EF
事情虚拟财产是,我有一个OData服务使用默认配置:的OData问题与EF
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; }
}
事情是,当我试图检索任何LabTest时,使用它的LabValue,使用Odata List<LabValue> LabValues
每次都是空的,而不是null,但是为空。谁能帮我这个?。在我的服务中使用EF课程。
我想你正在使用WCF数据服务来消耗你的OData提要。在这种情况下you must tell the service,你希望你的关系,将与主要的实体加载:
var data = dataServiceContext.LabTests.Expand("LabValues").FirstOrDefault();
如果通过URL手动调用数据服务,你必须使用expand
query option。
要说清楚 - 服务没有透明的延迟加载。延迟加载是当您直接使用当前EF上下文范围中同一层上的实体时使用的EF功能。当您使用OData Feed时,您很可能不在同一层(甚至是机器)上,并且不提供透明的延迟加载以避免额外的网络往返服务。
太棒了,我必须首先获取我需要的对象,然后告诉服务加载属性,第一个链接是您提供的非常有用的,Thanxs Ladislav。 – 2012-02-06 16:15:34
如果您使用扩展,您告诉服务返回您的对象和它的关系在一次往返。 – 2012-02-06 17:46:16
当您关闭LazyLoading时,您必须手动加载每个导航属性,您是否在代码中的任何位置执行此操作? – 2012-02-03 21:14:31
@Piotr Auguscik,通过在列表属性上执行ForEach,我手动加载或不加载? – 2012-02-03 21:31:40
依赖EF verison,你必须使用特殊的函数来加载像'Include'或'entry.Collection(r => r.SomeCollection).Load()'这样的属性。使用foreach,如果触发'lazyloading',则触发它。 – 2012-02-03 21:36:30