2010-04-12 30 views
3

我有一個WCF RIA Services應用程序和一個UserRole類型的模型,其中包含一組UserPermission對象。我在域服務中使用.Include(「UserPermission」),當我調試它時,我已經驗證它在返回之前肯定包含UserPermission類型。RIA服務不返回包含類型集合屬性

當我調試Silverlight 3客戶端時,它返回UserRoles但UserPermission屬性都是空的。這些是相同的UserRoles,顯示服務上有UserPermissions。

由於服務和客戶端上的所有內容都顯示正確,因此我將重點放在元數據類上,但仍然找不到任何錯誤。

[MetadataTypeAttribute(typeof(UserRole.UserRoleMetadata))] 
public partial class UserRole 
{ 
    internal sealed class UserRoleMetadata 
    { 
     public int RoleID; 
     public string Name; 

     [Include] 
     [Association("UserPermissions", "RoleID", "PermissionID")] 
     public EntityCollection<UserPermission> UserPermissions; 
    } 
} 

這裏的域名服務方法:

public IEnumerable<UserRole> GetUserRoles() 
{ 
    IEnumerable<UserRole> roles = this.ObjectContext.UserRole.Include("UserPermissions"); 
    return roles; // In debug, roles.First().UserPermissions.Count = 2 here 
        // For now, there is only one single role in the ObjectContext and it has 
        // two UserPermissions 
} 

這裏的Silverlight客戶端方法:

context.Load(context.GetUserRolesQuery(), loadOp => 
{ 
    IEnumerable<UserRole> roles = loadOp.Entities; 
    // This should show 2, but shows 0: 
    MessageBox.Show("Permissions loaded: " + roles.First().UserPermissions.Count.ToString()); 
} 

有誰知道任何可能導致這些包括實體的損失?我在其他幾個地方也做同樣的事情,他們工作。

回答

7

行,解決了它!我查看了使用Fiddler在服務器和客戶端之間傳遞的序列化數據,發現所有嵌套類型實際上都已通過,但它們之間的關係不正確。經過一些修改,思考和在線研究後,結果發現EF中的多對多關係無法按預期工作,如果您依靠中間表來管理關係,則需要包含這些表在模型中。

爲了讓我的應用程序來工作,我做了以下內容:

1)通過添加一個主鍵標識列剛一進數據庫,並更新了中介表(即管理許多一對多關係的) 。一旦添加,EF生成的模型將在更新時包含這些表格。

2)爲了徹底清除我現有的模型,我使用了在數據庫中重命名我的表,更新模型,重命名數據庫表,然後再次更新並選擇要添加的表的技巧。這可能是矯枉過正,但由於過去的問題,我發現這是確保桌子完全乾淨的最佳方式。

3)我必須爲新的中間類型添加所有元數據類,併爲現有類型更新元數據類。我寫了一個VS片段(類型'meta'),用於更快地添加這些類。您可以下載安裝程序here

4)除了添加/更新所有現有的元數據類,你需要確保你的所有「AssociationAttributes」使用中介類型,並指定外鍵的屬性:

[MetadataTypeAttribute(typeof(UserPermissionMembers.UserPermissionMembersMetadata))] 
public partial class UserPermissionMembers 
{ 
    internal sealed class UserPermissionMembersMetadata 
    { 
     private UserPermissionMembersMetadata() 
     {} 

     public int ID; 
     public UserRole UserRole; 

     [Include] 
     [Association("UserPermission", "fkPermissionID", "PermissionID", IsForeignKey = true)] 
     public UserPermission UserPermission; 
    } 
} 

5)我更新了域名服務方法:

public IEnumerable<UserRole> GetUserRoles() 
{ 
    IEnumerable<UserRole> roles = this.ObjectContext.UserRole.Include("UserPermissionMembers.UserPermission"); 
    return roles; 
} 

6)我更新了客戶端方法以利用新的類型。

context.Load(context.GetUserRolesQuery(), loadOp => 
{ 
    IEnumerable<UserRole> roles = loadOp.Entities; 
    MessageBox.Show("Permissions loaded: " + roles.First().UserPermissionMembers.Count.ToString()); 
} 

注意:即使知道問題仍然花了一段時間來正確地配置所有AssociationAttributes使它們指向正確的屬性。如果您遇到問題,我建議您仔細檢查。

這是一個應該更優雅的東西很多的痛苦。我還沒有看過EF v4,但我希望它可以改善這一切。