Дописать данные в БД один ко многим Entity Framework
Изучаю EF, столкнулся с некой проблемой работы с БД один ко многим. Например, у меня есть две таблицы:
1-я: Users
2-я: Roles
В таблице роли должно быть, например, две роли "администратор" и "супер администратор", Id которых должны присваиваться нужным полям в таблице Users. Но когда я хочу троим пользователям задать уже существующую роль, получается, что роль "администратор" создаётся заново и юзеру присваивается id новой роли. Как с этим быть и работать?
Users
public class Users
{
[Key]
public int Id { get; set; }
[Required]
public string Login { get; set; }
[Required]
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public int? RoleId { get; set; }
public Role Role { get; set; }
}
Roles
public class Role
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Users> UserAll { get; set; }
public Role()
{
UserAll = new List<Users>();
}
}
Выполнение самой записи
using (AppContext db = new AppContext())
{
var role1 = new Role { Name = "Administrator" };
var user1 = new Users { Login = "admin", Password = "1231", Role = role1, Email = "[email protected]", FirstName = "null", LastName = "null"};
db.Users.AddRange(new List<Users>{user1});
db.SaveChanges();
}
Единственное до чего додумался, это заранее скачивать данные из таблицы Role, затем сравнивать с тем, что вводит пользователь и только потом присваивать с выбранным id.
Ответы (1 шт):
Этой строкой вы создаёте новую роль:
var role1 = new Role { Name = "Administrator" };
Естественно, она потом добавляется в БД.
Нужно получить уже существующую роль из БД:
var role = db.Roles.SingleOrDefault(r => r.Name == "Administrator");
if (role == null)
{
// обработка ошибки или создание роли
};
Чтобы не допустить случайного создания новой роли с тем же именем, следует наложить ограничение уникальности на колонку Role.Name. В разных версих EF это делается по-разному.
Класс Users содержит информацию об одном человек, поэтому название должно быть в единственном числе: User.
Не храните в БД пароли в чистом виде. Храните их хэши, причём обязательно с солью.