EF вставить запись в отношениях «многие ко многим» - PullRequest
0 голосов
/ 20 июня 2019

Я новичок в концепции структуры сущностей.Я создаю модель для Userlist и ролей, которые будут определять там уважаемый доступ.У пользователя может быть много ролей, а у роли может быть много пользователей

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

вот моя база данных enter image description here

Я пытаюсь добавить нового пользователя с помощью коданиже, но я получаю эту ошибку {"ограничение не удалось \ r \ nUNIQUE ограничение не удалось: TblRole.RoleID"}

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

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

ограничение не удалось \ r \ nUNIQUE ограничение не удалось: TblRole.RoleID

может означать, что вы пытаетесь добавить TblRole в свою базу данных, но уже существует существующая запись, котораяимеет тот же RoleID.

Глядя на ваш код, похоже, что вы получаете где-то roles, а затем создаете новый экземпляр DatabaseContext, db.Проблема в том, что db считает, что roles - это новые записи, когда вы звоните db.TblUser.Add(newuser).Чтобы сообщить db, что roles уже есть в базе данных, вы можете вызвать db.TblRole.Attach для каждого TblRole в roles перед добавлением newUser.

. Вы можете узнать больше оэто понятие (сущность состояния) здесь .

0 голосов
/ 20 июня 2019

Настройка Отношения «многие ко многим» с использованием Fluent API

Подробнее об Отношениях сущностей можно узнать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...