WCF数据服务中的关系导航与自定义(对象)数据源

时间:2011-04-06 20:26:45

标签: entity-framework odata wcf-data-services

我的数据中有3个级别的层次结构:
DepartmentList - > EmployeeCollection - >雇员

基本上,有一些部门,每个部门都包含许多员工。

这是我的源代码:

public class DataService : DataService<Departments>


public class Departments
    {
        private List<Department> _deptCollection;

        public IQueryable<Department> DeptCollection { get { return this._deptCollection.AsQueryable(); } }

...
...
    }

[DataServiceKey("DepartmentId")]
public class Department
{
    public string DepartmentId { get; set; }

    private IList<EmployeeBase> _employees { get; set; }

    public IQueryable<EmployeeBase> Employees
    {
        get { return _employees.AsQueryable(); }
    }

    ...
}


[DataServiceKey("Id")]
public class EmployeeBase
{
    public string Id { get; set; }
    public string Name { get; set; }
}

当我尝试浏览DataService时,出现以下错误:

  

服务器遇到错误   处理请求。例外   消息是'在数据上下文类型   “部门”,有一个顶部   IQueryable属性'DeptCollection'   其元素类型不是实体   类型。确保IQueryable   property属于实体类型或指定   上的IgnoreProperties属性   数据上下文类型忽略这一点   属性。'。请参阅服务器日志了解更多   细节。异常堆栈跟踪是:

     

在   System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata(IDictionary 2 knownTypes, IDictionary 2个childTypes,   IDictionary的2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata() at System.Data.Services.DataService 1.CreateProvider()   在   System.Data.Services.DataService 1.HandleRequest() at System.Data.Services.DataService 1.ProcessRequestForMessage(流   messageBody)at   SyncInvokeProcessRequestForMessage(对象   ,Object [],Object [])at   System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象   实例,对象[]输入,对象[]&amp;   输出)   System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.MessageRpc.Process(布尔   isOperationContextSet)

我认为我需要在这里实现关系导航,实体数据模型本身为SQL Source实现。但我不太确定。任何指针都会非常有用。 如果您需要任何进一步的信息,请与我们联系。

感谢。

1 个答案:

答案 0 :(得分:1)

实体类的键属性必须是属性。在您的情况下,Department.DepartmentId是一个字段。把它变成一个属性。 另一个说明。没有必要从Department.Employees返回IQueryable,只有IEnumerable才会被使用(尽管它没有受到伤害)。 您需要在Departments类上使用IQueryable属性才能使其正常工作。每个实体都必须拥有自己的顶级实体集。