2015-01-09 36 views
2

我遇到了一個問題,讓我繞着圈子走。我需要實現的是我們網站上的用戶和組。我們在C#中使用ASP.NET實體框架(數據庫優先)。實體框架 - 具有多對多表的用戶和組

這裏是要求:

  1. 有用戶
  2. 有基團(其是由管理員創建,將在DB存在)
  3. 每個用戶可在一個或多個組
  4. 每個組可以有0個或更多的用戶。

當前組是: 管理員 董事會 編輯

因此,在短期,「用戶1」可兼董事組管理員組的成員的編輯&董事會,但沒有。

首先我用Users,Groups和UserGroups表構建了我的數據庫。該羣組表具有以下字段:

User    Group 
-----------  ------------ 
UserId (PK)  GroupId (PK) 
Name    Name 
...    ... 

     \   /
      UserGroup 
     ------------- 
      UserGroupTestID (PK) 
      UserId (FK) 
      GroupId (FK) 

這種方法的問題是,EF不會讓我增加超過1個用戶此表扔「違反多重約束」的錯誤,因爲它是1個用戶到多個關係。

所以我改變了它是一個多到多臺通過降低PK如下:

User    Group 
-----------  ------------ 
UserId (PK)  GroupId (PK) 
Name    Name 
...    ... 

     \   /
      UserGroup 
     ------------- 
      UserId (FK) 
      GroupId (FK) 

我現在能夠訪問user.Group,並能一組添加到該用戶。當我將用戶添加到組中時,我查詢了現有組並添加它,如下所示:

user.Groups.Add(ctx.Groups.Where(g => g.GroupID == 12).First ();

的問題是,這創造了一個新組該用戶在組表 - 儘管集團的ID是正確的(12),當它被保存到數據庫

我所需要的。做以下事情:

  1. 創建一個用戶並將新用戶放入一個或多個組
  2. 編輯現有用戶以從組中添加或刪除它們。

我確定我做錯了什麼(可能是骨頭),但如果任何人都可以幫助我實現這一目標,我會非常感激。

在此先感謝!

Admin_AddUser.aspx中的代碼。CS:

User user = new User(); 
user.CustomerID = CustomerID; 
user.IsClub = false; 
user.IsDistrict = true; 
user.FirstName = txtFirstName.Text; 
user.LastName = txtLastName.Text; 
user.Email = txtEmail.Text; 
user.Password = txtPassword.Text; 
user.AccountActive = true; 

foreach(RadListBoxItem item in lbSelectedRoles.Items) 
{ 
    user.Roles.Add(UserData.GetRole(DCManager.Instance.SiteSettings.Customer.CustomerID, int.Parse(item.Value))); 
} 

bool rtn = UserData.CreateUser(user); 
... 

代碼在CREATEUSER方法:

public static bool CreateUser(User user) 
{ 
    using (var ctx = new DCEntities()) 
    { 
    //Check if the login credentials already exist 
    if (ctx.Users.Where(u => u.Email == user.Email 
          && u.Password == user.Password).Count() > 0) 
     return false; 
    else 
    { 
     ctx.Users.Add(user); 
     ctx.SaveChanges(); 

     return true; 
    } 
    } 
} 

=========================

在我的項目中,組和實際稱爲「角色」

由於DB中的UserGroups表是多對多的,因此它不會顯示在EDMX文件中,而是顯示在用戶組(在我的db中的角色)以多對多方式鏈接。 Objects

映射詳細信息:

User Mapping Details Roles Mapping Details

+0

你能發佈你的映射嗎? – 2015-01-09 21:08:25

+0

嗨mmillican - 我不確定你的意思是映射。你的意思是來自SQL還是EF EDMX方面? – Nutkraker 2015-01-09 21:11:00

+0

如果您不是先使用代碼,那麼EDMX。 – 2015-01-09 21:11:59

回答

0

如果我理解正確你的問題。我建議你做以下幾點:

  1. 創建一個表UsersAndGroups(int:PK,UserId:FK,GroupId:FK)。
  2. 建立用戶與UsersAndGroups之間的關係爲一對多關係。
  3. 建立Groups和UsersAndGroups之間的關係爲一對多關係。
  4. 刪除用戶和組之間的關係。

這將讓你以下幾點:

  1. 加入行UsersAndGroups表以一個或多個組添加用戶。
  2. 通過從UsersAndGroups表中選擇具有某個UserId的所有記錄來獲取用戶組。
  3. 通過從UsersAndGroups表中選擇具有某個GroupId的所有記錄來獲取組用戶。

希望我理解你的權利。

+0

嗨阿列 - 我認爲你理解我是對的。我最初做到了這一點(創建了3個表格),但EF將用戶和組關係視爲一對多關係。你是否建議我總共創建5張桌子?添加2個「橋」表來創建UsersAndGroups&Users和UsersAndGroups&Groups之間的多對多關係? – Nutkraker 2015-01-09 22:01:53

+0

嗨Nutkraker,我的壞。這些關係應該是從用戶到UsersAndGroups和從Group到UsersAndGroups(編輯)的一對多關係。 – 2015-01-10 11:09:21

+0

嗨阿列 - 問題在於,用戶只能在1組中的一部分,在那種情況下,我需要他們能夠在1組以上。 – Nutkraker 2015-01-10 14:41:01