2012-07-30 71 views
1

我想从我的wcf服务返回一个自定义类。我的代码在下面,出现错误。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; }** 

    } 

回答

0

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

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

从你的问题看来你有一个属性是一个列表。我无法用包含其他实体的属性创建这些复杂类型。不是说我无法弄清楚它是不可能的。

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

山姆穆勒对使用这种技术的一个非常漂亮的博客,检查出来:http://samuelmueller.com/2009/11/working-with-projections-and-dtos-in-wcf-data-services/

+0

非常感谢您的回答。是的,我正在使用实体框架。我已经尝试过复杂的类型,但没有运气。只有像int,字符串等基本类型我必须用属性填充我的列表:(.sql关系返回一个实体集合是e.user,但我无法弄清楚如何使用并显示它 – 2012-07-30 14:18:32

+0

你的用户对象是什么包含,当你收到你的用户对象时,是否有可能创建第二个回调服务器? – muck41 2012-07-30 14:26:40

+0

或者你是否考虑过在你的OData查询中使用$ expand调用?如果你的实体之间有相互关系,想想你的问题的外观 – muck41 2012-07-30 14:28:02