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;
}
}