WCF oData表关系

时间:2012-07-30 09:54:30

标签: sql wcf wcf-data-services odata

我正在尝试从我的wcf服务返回一个自定义类。我的代码在下面并且收到错误。

服务器在处理请求时遇到错误。异常消息是'DealerModel'类型的属性'UserList'不是有效属性。不支持其类型是基元或复杂类型集合的属性。请参阅服务器日志以获取更多详异常堆栈跟踪是:

我想获得如下的json值;

<Dealer>
        <DealerName/>
        <DealerAdress/>
        <Users>
              <FirstName/>
              <LastName/>
              <FirstName/>
              <LastName/>
        </Users>
</Dealer>

我的代码

using System;
using System.Linq;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

public class DataModel:IDisposable
{
    private xModel.xEntities _dbContext = new xSocialModel.xEntities();

    public DataModel()
    {
        Users = from e in _dbContext.Users
                select new UserModel
                {
                    UserID = e.UserID,
                    Firstname = e.Firstname,
                    Lastname = e.Lastname
                };

        Dealers = from e in _dbContext.Dealers
                  select new DealerModel
                  {
                      DealerID = e.DealerID,
                      DealerName = e.Name,
                      DealerAddress = e.Address,
                      UserList = e.Users
                  };

    }

    /// <summary>Returns the list of users.</summary>
    public IQueryable<UserModel> Users { get; private set; }

    public IQueryable<DealerModel> Dealers { get; private set; }


    void IDisposable.Dispose()
    {
        _dbContext.Dispose();
    }
}



    using System;
    using System.Data.Services.Common;
    using System.Runtime.Serialization;
    using System.Collections.Generic;
    using System.ServiceModel;
    using System.Data.Objects.DataClasses;
    using System.Linq;

    /// <summary>Represents a User.</summary>

    [DataServiceKey("UserID")]
    public class UserModel
    {
        public Guid UserID { get; set; }

        public string Firstname { get; set; }

        public string Lastname { get; set; }

    }


    [DataServiceKey("DealerID")]
    public class DealerModel
    {
        public Guid DealerID { get; set; }

        public string DealerName { get; set; }

        public string DealerAddress { get; set; }

        **public EntityCollection<xModel.User> UserList { get; set; }**

    }

1 个答案:

答案 0 :(得分:0)

我也遇到了很多麻烦。投影似乎不像RIA服务那样好用。我将继续并假设您正在使用实体框架。我发现这样做的唯一方法是在edmx中创建复杂类型。

要执行此操作,请打开EDMX,然后在右侧窗格中选择“模型浏览器”。在“模型”节点下,您将看到“复杂类型”,右键单击并选择“创建复杂类型”。然后,在同一窗口中,您可以命名您的类型并为其提供罐装类型的各种属性。

从您的问题看来,您有一个列表属性。我无法使用包含其他实体的属性创建这些复杂类型。不是说不可能仅仅是因为我无法弄明白。

现在在DataService中,创建一个返回类型为新复杂类型的服务方法。在服务方法中,使用投影填充对象(或列表)并像任何其他实体一样返回它。在前端,您需要像服务方法而不是实体一样调用它,否则JSON看起来与其他实体查询类似。

Sam Mueller有一个关于使用这种技术的非常好的博客,请查看:http://samuelmueller.com/2009/11/working-with-projections-and-dtos-in-wcf-data-services/