在EF中使用虚拟属性的Odata问题

时间:2012-02-03 21:08:56

标签: c# entity-framework odata

问题是我有一个默认配置的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。

1 个答案:

答案 0 :(得分:7)

我猜您正在使用WCF数据服务来使用您的OData Feed。在这种情况下you must tell the service,您希望将您的关系与主实体一起加载:

var data = dataServiceContext.LabTests.Expand("LabValues").FirstOrDefault();

如果您通过网址手动调用数据服务,则必须使用expand query option

要说清楚 - 服务没有透明的延迟加载。延迟加载是直接使用当前EF上下文范围内同一层上的实体时使用的EF功能。当您使用OData源时,您很可能不在同一层(甚至是机器)上,并且不提供透明的延迟加载以避免额外的网络往返服务。