C# 实体框架-具有多对多表的用户和组
我遇到了一个让我左右为难的问题。我需要实现的是我们网站中的用户和组。我们在C#中使用实体框架(数据库优先)和ASP.NET 以下是要求:C# 实体框架-具有多对多表的用户和组,c#,sql-server,database,entity-framework,C#,Sql Server,Database,Entity Framework,我遇到了一个让我左右为难的问题。我需要实现的是我们网站中的用户和组。我们在C#中使用实体框架(数据库优先)和ASP.NET 以下是要求: 有用户 存在组(由管理员创建,并将存在于数据库中) 每个用户可以在一个或多个组中 每个组可以有0个或更多用户 目前的工作组是: 管理员 董事会 编辑 简言之,“User1”可以同时位于Editor和Board of Directors组中,但不能是Administrator组的成员 首先,我用一个Users、一个Groups和一个UserGroups表构建了我
User Group
----------- ------------
UserId (PK) GroupId (PK)
Name Name
... ...
\ /
UserGroup
-------------
UserId (FK)
GroupId (FK)
我现在可以访问user.Group,并可以向该用户添加组。当我向组中添加用户时,我查询现有组并按如下方式添加:
Add(ctx.Groups.Where(g=>g.GroupID==12).First()
问题是,这在Groups表中为此用户创建了一个新组,即使该组的ID在保存到数据库时是正确的(12)
我需要做以下几件事:
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;
}
}
}
=========================
在我的项目中,组和组实际上称为“角色”
由于数据库中的UserGroups表是多对多表,因此它不会显示在EDMX文件中,但用户和组(my DB中的角色)链接为多对多。
映射详细信息:
如果我正确理解了您的问题,我建议您执行以下操作:
public virtual List<User> Users { get; set; }
你能发布你的映射吗?嗨,mmillican-我不确定你所说的映射是什么意思。你是指从SQL还是EF EDMX方面?如果你不先使用代码,EDMX。好的-你想从映射详细信息窗口发布它吗?针对哪些对象?两个用户和组?是的,这应该都可以。嗨,Aleh-我想你理解我的意思。我做到了最初(创建了3个表),但EF将用户和组端的关系作为一对多。您是否建议我总共创建5个表?再添加2个“桥接”用于在UsersAndGroups&Users和UsersAndGroups&Groups之间创建多对多关系的表?嗨,Nutkraker,我的错。从用户到UsersAndGroups和从组到UsersAndGroups的关系应该是一对多(编辑).Hi-Aleh-问题是,在我需要用户能够加入多个组的情况下,用户只能是一个组的一部分。Hi-Nutkraker-用户可以是任意数量组的成员。UsersAndGroups表中的每个记录定义了用户和组之间的关系。User和group表与每个ot无关因此,要将用户添加到组中,只需向UsersAndGroups表中再添加一条记录即可。
public virtual List<User> Users { get; set; }
public virtual List<Role> Roles { get; set; }
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace MyProject.EFTest
{
public class Role
{
[Key]
public int RoleID { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
public virtual List<User> Users { get; set; }
}
public class User
{
[Key]
public int UserID { get; set; }
public string Name { get; set; }
public virtual List<Role> Roles { get; set; }
}
}
CreateTable(
"dbo.UserRole",
c => new
{
User_UserID = c.Int(nullable: false),
Role_RoleID = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.User_UserID, t.Role_RoleID })
.ForeignKey("dbo.User", t => t.User_UserID)
.ForeignKey("dbo.Role", t => t.Role_RoleID)
.Index(t => t.User_UserID)
.Index(t => t.Role_RoleID);