C# EF在多对多关系中插入记录

C# EF在多对多关系中插入记录,c#,entity-framework,sqlite,C#,Entity Framework,Sqlite,我是实体框架概念的新手。我为用户列表和角色创建模型,这些模型将决定访问权限。用户可以有多个角色,角色可以有多个用户 public class TblUser { [Key] [MaxLength(50)] public string UserID { get; set; } [MaxLength(35)] public string UserName { get; set; } [MaxLength(150)] public string

我是实体框架概念的新手。我为用户列表和角色创建模型,这些模型将决定访问权限。用户可以有多个角色,角色可以有多个用户

 public class TblUser
{
    [Key]
    [MaxLength(50)]
    public string UserID { get; set; }
    [MaxLength(35)]
    public string UserName { get; set; }
    [MaxLength(150)]
    public string EMailAddress { get; set; }
    [MaxLength(150)]
    public string Password { get; set; }
    public DateTime LastLogIn { get; set; }
    [MaxLength(3)]
    public string ResetPassword { get; set; }
    [MaxLength(150)]
    public string ResetNewPassword { get; set; }
    public DateTime ResetPasswordExpire { get; set; }
    [MaxLength(3)]
    public string Active { get; set; }
    public List<TblRole> Roles { get; set; }
}

public class TblRole
{
    [Key]
    [MaxLength(50)]
    public string RoleID { get; set; }
    [MaxLength(50)]
    public string RoleName { get; set; }
    public List<TblUser> Users { get; set; }
}
公共类TblUser
{
[关键]
[MaxLength(50)]
公共字符串用户标识{get;set;}
[MaxLength(35)]
公共字符串用户名{get;set;}
[MaxLength(150)]
公共字符串电子邮件地址{get;set;}
[MaxLength(150)]
公共字符串密码{get;set;}
public DateTime LastLogIn{get;set;}
[MaxLength(3)]
公共字符串重置密码{get;set;}
[MaxLength(150)]
公共字符串ResetNewPassword{get;set;}
public DateTime ResetPasswordExpire{get;set;}
[MaxLength(3)]
公共字符串活动{get;set;}
公共列表角色{get;set;}
}
公共类TblRole
{
[关键]
[MaxLength(50)]
公共字符串RoleID{get;set;}
[MaxLength(50)]
公共字符串RoleName{get;set;}
公共列表用户{get;set;}
}
这是我的数据库

我现在尝试使用下面的代码添加新用户,但我发现了这个错误 {“约束失败\r\n唯一约束失败:TblRole.RoleID”}

public string addNewUser(字符串用户名、字符串电子邮件、Model.DB.TblRole角色)
{
使用(DatabaseContext db=newdatabasecontext())
{
ExpenseMonitoringSystem.Controller.Security sec=新安全性();
字符串randomPassword=秒加密(RandomString(6,false));
if((来自db.TblUser中的用户,其中user.UserName==UserName选择用户)。FirstOrDefault()!=null)
抛出新异常(“用户名已被使用”);
if((来自db.TblUser中的用户,其中user.EMailAddress==电子邮件选择用户).FirstOrDefault()!=null)
抛出新异常(“电子邮件已被使用”);
var newuser=new expensemoningsystem.Model.DB.TblUser
{
UserID=Guid.NewGuid().ToString(),
密码=随机密码,
用户名=用户名,
ResetPassword=“是”,
ResetNewPassword=randomPassword,
ResetPasswordExpire=DateTime.Now.AddDays(10),
EMailAddress=电子邮件,
Active=“是”,
角色=新列表(){Roles}
};
db.TblUser.Add(newuser);
db.SaveChanges();
返回随机密码;
}
}
约束失败\r\n唯一约束失败:TblRole.RoleID

这可能意味着您正试图将
TblRole
添加到数据库中,但已有一条记录具有相同的
RoleID

查看您的代码,您似乎在某处获得了
角色
,然后创建了
数据库上下文
数据库
的新实例。问题是当您调用
db.TblUser.Add(newuser)
时,
db
认为
roles
是新记录。要告诉
db
数据库中已存在
角色
,可以在添加
新用户
之前,在
角色
中的每个
TblRole
上调用
db.TblRole.Attach

你可以

约束失败\r\n唯一约束失败:TblRole.RoleID

这可能意味着您正试图将
TblRole
添加到数据库中,但已有一条记录具有相同的
RoleID

查看您的代码,您似乎在某处获得了
角色
,然后创建了
数据库上下文
数据库
的新实例。问题是当您调用
db.TblUser.Add(newuser)
时,
db
认为
roles
是新记录。要告诉
db
数据库中已存在
角色
,可以在添加
新用户
之前,在
角色
中的每个
TblRole
上调用
db.TblRole.Attach


您可以使用Fluent API配置多对多关系


您可以了解有关实体关系的更多信息

使用Fluent API配置多对多关系


您可以了解有关实体关系的更多信息

仅作为重复检查的旁注,
if((来自db.TblUser中的用户,其中user.EMailAddress==电子邮件选择用户)。FirstOrDefault()!=null)
可以写成
if(db.TblUser.Any(user=>user.EMailAddress==电子邮件))
仅作为重复检查的旁注,
if((来自db.TblUser中的用户,其中user.EMailAddress==电子邮件选择用户)。FirstOrDefault()!=null)
可以写成
if(db.TblUser.Any(user=>user.EMailAddress==电子邮件))
public string addNewUser(string Username, string Email, Model.DB.TblRole roles)
    {
        using (DatabaseContext db = new DatabaseContext())
        {
            ExpenseMonitoringSystem.Controller.Security sec = new Security();
            string randomPassword = sec.Encrypt(RandomString(6, false));

            if((from user in db.TblUser where user.UserName==Username select user).FirstOrDefault()!=null)
                throw new Exception("The username is already used");
            if ((from user in db.TblUser where user.EMailAddress == Email select user).FirstOrDefault() != null)
                throw new Exception("The email is already used");

            var newuser = new ExpenseMonitoringSystem.Model.DB.TblUser
                {
                    UserID = Guid.NewGuid().ToString(),
                    Password = randomPassword,
                    UserName = Username,
                    ResetPassword = "YES",
                    ResetNewPassword = randomPassword,
                    ResetPasswordExpire = DateTime.Now.AddDays(10),
                    EMailAddress = Email,
                    Active = "YES",
                    Roles = new List<Model.DB.TblRole>() { roles }
                };

            db.TblUser.Add(newuser);

            db.SaveChanges();
            return randomPassword;
        }
    }