2010-01-24 13 views
5

我是新來的實體框架,並試圖弄清楚事情。我創建了一個不太複雜的數據庫。大約有7個表,其中3個映射表將一個表記錄與另一個表記錄相關聯。我使用的是這裏的例子是這樣的:使用實體框架,我該如何反映多對多的關係,並將存在的實體添加到正在創建的新實體中?

  • 表用戶

    • 用戶ID
    • 用戶名
  • 表角色

    • 角色ID
    • ROLENAME
  • 表:UserRole的

    • 用戶ID
    • 角色ID

的外鍵在我的數據庫映射。當我在VS 2008中創建一個新的實體模型時,該圖似乎具有正確的關係,但不會爲UserRole表創建一個表。該關係被映射爲用戶之間的多對多角色。

我的問題是,我可以創建新的用戶,我可以創建新的角色,但我不知道如何創建一個新的用戶與現有的角色。此外,UserRole表可能未在模型中正確映射以開始。這裏是我到目前爲止的代碼:

ObjectQuery<Role> roles = context.Roles; 
Role role = context.Roles.Where(c => c.RoleName == "Subscriber").First(); 

User user = new User 
{ 
    DisplayName = "TestCreate2", 
    Email = "[email protected]", 
    Password = "test" 
};    
context.AttachTo("Roles", role); 
user.Roles.Add(role);    
context.AddToUsers(user); 
context.SaveChanges(); 

下面是我收到的錯誤:

無法更新EntitySet的「的UserRole」,因爲它有一個DefiningQuery並沒有元素,以支持當前的元素存在操作。

下面是涉及到的UserRole表中的XML:

<EntitySet Name="UserRoles" EntityType="RememberTheJourneyModel.Store.UserRoles" store:Type="Tables" store:Schema="dbo" store:Name="UserRoles"> 
     <DefiningQuery>SELECT 
    [UserRoles].[Role_id] AS [Role_id], 
    [UserRoles].[User_id] AS [User_id] 
    FROM [dbo].[UserRoles] AS [UserRoles]</DefiningQuery> 
     </EntitySet> 

它拔牙只是爲了弄清楚如何查詢,使得它給了我一個實際作用的實體範圍內。我確定這個問題與UserRole的映射方式有關,但我只是從這裏開始,並不知道哪裏可能出錯。

我真的已經搜索了谷歌&這個網站,但我想我還沒有拿出正確的搜索參數來找到一個問題,可以幫助我解決這個問題。我發現有一個問題說EF有這個問題,但是如果你映射表使兩個列成爲主鍵,它就會自行解決。我不知道該怎麼做。這是在數據庫(使用SQL SERVER 2005 EXPRESS)還是在映射中完成的?這是一個個人項目,所以如果需要的話,我可以發佈更多關於代碼或xml的細節。任何和所有的幫助將不勝感激。

回答

4

我記得之前也遇到過這個問題......我相信我通過在我的關聯表中創建兩個列鍵來解決它。

您可以將兩列都作爲SQL Server Management Studio表設計器中的主鍵。 只需同時突出顯示User_Id和Role_Id,右鍵單擊左側並選擇主鍵......這將使得沒有記錄可以具有User_Id和Role_Id的相同組合。使每個條目都具有唯一性。

然後,你可以在實體框架設計器中更新你的數據模型..希望能很好的去。

我相信,如果一個表沒有定義任何鍵來確保記錄是唯一的,那麼EF將無法正確更新記錄,因此框架可以防範這種情況。

+2

就是這樣!我只是不知道如何分配2個主鍵。突出顯示兩行工作。謝謝! – jason 2010-01-24 23:40:00

+0

沒問題 - 很高興我能幫到你。 – markt 2010-01-25 02:42:59

相關問題