2

好吧,我知道這是問了一百萬次,但我仍然無法找到一個可行的解決方案。希望我只是想念一些東西。 使用Silverlight實體,通過RIA 我在我的數據庫中有多對多的表結構。實體/ ria包含多對多

[System] - [SystemUsers] - [Users] 

橋表只有兩個ID,所以自然實體doens't不包括它在模型中。

我知道RIA不喜歡多對多的關係,所以我將關聯屬性標籤添加到集合中,現在至少可以在客戶端看到集合屬性。

[Association("DMSSystem_Users", "DMSSystemId", "UserId")] 
[Include] 
[Composition] 
public EntityCollection<Users> Users { get; set; } 

在我的域名服務,我已經試過,包括用戶:

public IQueryable<DMSSystem> GetSystem() 
{ 
    return this.ObjectContext.DMSSystem.Include("Users"); 
} 

我從來沒有得到用戶在客戶端有別的我失蹤讓用戶爲包裝併發送給客戶?

回答

1

RIA與EF有米的反感:M的關係。你需要做的是幫助RIA將M:M看作兩個1:M的關係。

在你的鏈接表上添加一個額外的列(我添加類似IgnoreThisField的東西),並使它有點類型。

當EF看到這張表時,它現在將以不同的方式解釋它,讓您可以處理M:M關係。

+0

這可以通過使用[Association]屬性來避免嗎? (假設我可以弄清楚如何正確使用它)我並不是真的想修改我的數據模型並重新創建我的域名... – Shaboboo 2011-03-22 15:03:55

+0

我認爲你需要修改你的數據模型(對不起)。添加關聯只會在RIA生成的M:M之上添加更多關係信息到您的實體。 – Rus 2011-03-22 16:13:42

+3

這是迄今爲止RIA最荒謬的限制。它永遠不應該出現在這個狀態 - 他們使用「域模型」這樣的詞來欺騙開發人員認爲我們可以開發具有如此基本限制的實際豐富域名,這是完全可恥的。 – 2011-03-22 20:16:57

1

我不知道實體框架,但這裏是如何工作的RIA與NHibernate ...

我的模型是Users - UserRoleGrant - Role。你必須在頭腦中進行模型翻譯。

以下代碼的重要部分是...確保您的模型上有正確的關聯名稱,確保在關聯中設置了正確的屬性名稱,並在設置UserRole時設置UserRoleAssociation上的UserID屬性屬性。如果您未設置此ID,則無法通過關聯屬性訪問相關實體。

你可能不需要的成分屬性要麼但你可能會這樣閱讀,找出... http://ria.feedables.com/story/4583193/Composition-Support-in-RIA-Services

public class User 
{ 
    ...snip... 
    [Include] 
    [Association("UserToRoleAssociation", "Id", "UserId", IsForeignKey = false)] 
    public virtual IList<UserRoleAssociation> RoleGrants 
    { 
     get 
     { 
      return this.roleGrants; 
     } 
    } 
} 

public class UserRoleAssociation 
{ 
    /// <summary> 
    /// Backing field for User 
    /// </summary> 
    private User user; 

    /// <summary> 
    /// Gets or sets the id. 
    /// </summary> 
    /// <value>The relationships id.</value> 
    [Key] 
    public virtual long Id { get; set; } 

    /// <summary> 
    /// Gets or sets the user id. 
    /// </summary> 
    /// <value>The assigned users id.</value> 
    public virtual long UserId { get; set; } 

    /// <summary> 
    /// Gets or sets the user. 
    /// [Association("UserRoleGrants", "UserId", "Id", IsForeignKey = false)] 
    /// </summary> 
    /// <value>The user who has been granted this operation.</value> 
    [Include] 
    [Association("UserToRoleAssociation", "UserId", "Id", IsForeignKey = true)] 
    public virtual User User 
    { 
     get 
     { 
      return this.user; 
     } 

     set 
     { 
      this.user = value; 

      if (value != null) 
      { 
       this.UserId = value.Id; 
      } 
     } 
    } 
} 
+0

我想我可能已經完全回答了一個沒有被問到的問題。 – BenCr 2011-03-22 14:12:09

+0

我讀過關於Association屬性的衝突信息,是否需要創建橋類「UserRoleAssociation」?我做了一個開始,但仍然看到客戶端的財產沒有和我讀的東西似乎表明它並不需要...這可能是我失蹤的peice!我現在就試一試。 – Shaboboo 2011-03-22 14:19:47

+0

您可能不需要EF中的屬性,我正在使用NHibernate,因此它對於關聯而言是絕對需要的。我認爲我會錯誤地回答這個問題的原因是,當我重新閱讀這個問題時,我想它會問你如何在沒有鏈接實體的情況下執行多對多的問題。我想答案是,這是不可能的。 – BenCr 2011-03-22 14:32:36

0

過這個剛跑:http://m2m4ria.codeplex.com/

它需要一些設置,但暴露了一個圖,其解決了整個多到很多問題,而無需修改您的數據庫或實體模型中的客戶端。我發現它非常有用。