2011-02-01 49 views
0

我正在開發一個Silverlight業務應用程序,它使用返回POCO實體(TaskTime和User)的RIA服務。 TaskTime實體具有與其關聯的用戶實體。基於POCO實體的RIA服務無法對關聯實體進行反序列化

我創建了一個具有查詢功能(GetTimesheet)的域服務,該服務返回TaskTime實體的IQueryable集合,如果我不嘗試獲取關聯的用戶實體,它也可以正常工作,但只要我在'TaskTime'實體的'User'屬性上面包含[Include]和[Association]屬性,我開始得到反序列化錯誤:

格式化程序在嘗試反序列化消息時拋出異常[ InnerException消息是'Error in line 1 position 266. Element'http://schemas.microsoft.com/2003/10/Serilaization/Arrays:anyType'contaings data of the'http://schemas.datacontract.org/2004 /07/Timesheets.Entities:User'data contract。反序列化器不知道映射到此合約的任何類型。將相應的「用戶」添加到已知類型的列表中...'

它表明我使用'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

約翰 - 我有你的確切問題,你介意分享你的解決方法嗎? – 2011-03-14 15:08:20

+0

@Zein:如果您有問題並且提供的解決方案對您無效,您應該提出一個新問題並將其作爲參考。答案僅用於解決問題。 – 2011-03-14 15:16:13

回答

0

這可能是因爲你的DomainService中沒有用於User類的CRUD操作的方法(我猜測你沒有爲你的服務提供代碼)。

在RIA,如果你想要的類型暴露給客戶端,你必須做兩件事情之一:

(A)暴露CRUD操作該類型的服務

- 或 - (B)在父類(在本例中爲您的TaskTime類)上使用[Composition]屬性。

[Composition]屬性使得RIA只會通過它的父項向User類授予CRUD操作 - 所以User類不會在服務上擁有它自己的CRUD操作,因此只能通過它的更新父類。

你選擇哪條道路取決於你希望你的應用程序的功能。在某些情況下,[成分]是適當的。