基于POCO实体的RIA服务无法对相关实体进行反序列化

时间:2011-02-01 12:49:57

标签: silverlight silverlight-4.0 poco ria

我正在使用RIA服务开发Silverlight业务应用程序,该服务正在返回POCO实体(TaskTime和User)。 TaskTime实体具有与之关联的用户实体。

我创建了一个域服务,它有一个查询函数(GetTimesheet),它返回一个IQueryable TaskTime实体集合,如果我不尝试获取相关的用户实体,它可以正常工作,但是只要我包含'TaskTime'实体中'User'属性上方的[Include]和[Association]属性我开始得到反序列化错误说:

格式化程序在尝试反序列化消息时抛出异常[...] InnerException消息为“第1行位置错误266.元素”http://schemas.microsoft.com/2003/10/ Serilaization / Arrays:任何类型的'http://schemas.datacontract.org/2004/07/Timesheets.Entities:User'数据合同的数据。反序列化器不知道映射到此合同的任何类型。将相应的“用户”添加到已知类型列表中......'

它表明我使用'KnownTypes'属性,但我似乎无法找到解决此错误的地方。

有没有人知道如何解决这个问题?我可以在Silverlight应用程序的'Generated_Code'中看到,两种类型似乎都已正确创建,添加了DataContract属性等。

我的POCO实体的简化版本是:

public partial class TaskTime
{
    [Key()]
    public virtual int ID   { get; set; }

    public virtual int User_ID  { get; set; }

    [Include]
    [Association("TaskTime_User", "User_ID", "ID", IsForeignKey=true)]
    public virtual User User
    {
        get { return _user; }
        set
        {
            if (!ReferenceEquals(_user, value))
            {
                var previousValue = _user;
                _user = value;
                FixupUser(previousValue);
            }
        }
    }
}

public partial class User
{
    [Key()]
    public virtual int ID   { get; set; }

    public virtual string Name  { get; set; }
}

1 个答案:

答案 0 :(得分:0)

这可能是因为你的DomainService中没有用于在User类上进行CRUD操作的方法(我猜是因为你还没有为你的服务提供代码)。

在RIA中,如果要向客户端公开类型,则必须执行以下两项操作之一:

(A)在服务上公开该类型的CRUD操作

-OR -

(B)使用父类的[Composition]属性(在本例中为TaskTime类)。

[Composition]属性使得RIA只会通过它的父级向用户类授予CRUD操作 - 因此User类不会在服务上拥有它自己的CRUD操作,因此只能通过其父级更新类。

您选择哪条道路取决于您希望应用的运行方式。在某些情况下,[组成]是合适的。