我遇到了一個問題,讓我繞着圈子走。我需要實現的是我們網站上的用戶和組。我們在C#中使用ASP.NET實體框架(數據庫優先)。實體框架 - 具有多對多表的用戶和組
這裏是要求:
- 有用戶
- 有基團(其是由管理員創建,將在DB存在)
- 每個用戶可在一個或多個組
- 每個組可以有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),當它被保存到數據庫
我所需要的。做以下事情:
- 創建一個用戶並將新用戶放入一個或多個組
- 編輯現有用戶以從組中添加或刪除它們。
我確定我做錯了什麼(可能是骨頭),但如果任何人都可以幫助我實現這一目標,我會非常感激。
在此先感謝!
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中的角色)以多對多方式鏈接。
映射詳細信息:
你能發佈你的映射嗎? – 2015-01-09 21:08:25
嗨mmillican - 我不確定你的意思是映射。你的意思是來自SQL還是EF EDMX方面? – Nutkraker 2015-01-09 21:11:00
如果您不是先使用代碼,那麼EDMX。 – 2015-01-09 21:11:59