我正在使用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; }
}
答案 0 :(得分:0)
这可能是因为你的DomainService中没有用于在User类上进行CRUD操作的方法(我猜是因为你还没有为你的服务提供代码)。
在RIA中,如果要向客户端公开类型,则必须执行以下两项操作之一:
(A)在服务上公开该类型的CRUD操作
-OR -
(B)使用父类的[Composition]属性(在本例中为TaskTime类)。
[Composition]属性使得RIA只会通过它的父级向用户类授予CRUD操作 - 因此User类不会在服务上拥有它自己的CRUD操作,因此只能通过其父级更新类。
您选择哪条道路取决于您希望应用的运行方式。在某些情况下,[组成]是合适的。