Просто предположение: у вас, кажется, есть отдельные ObjectContexts для _userRepository
и для _roleRepository
. Загружая usersToGiveRole
из _userRepository
, вы присоединяетесь к этому контексту. selectedRole
, кажется, привязан к другому контексту _roleRepository
. Когда вы добавляете user
к selectedRole.UsersWithRole
, вы добавляете его во второй контекст (user
теперь находится в состоянии added
в контексте _roleRepository
). Когда вы вызываете SaveChanges
этого контекста, теперь в базе данных создается новый объект User.
Решение: убедитесь, что вы используете только один единственный контекст в обоих репозиториях.
Редактировать
Короче, что я имею в виду:
Не делайте этого:
class UserRepository
{
private readonly MyContext _context;
public UserRepository()
{
_context = new MyContext();
}
public void SaveChanges()
{
_context.SaveChanges();
}
}
class RoleRepository
{
private readonly MyContext _context;
public RoleRepository()
{
_context = new MyContext();
}
public void SaveChanges()
{
_context.SaveChanges();
}
}
...
var userRepository = new UserRepository();
var roleRepository = new RoleRepository();
// CRUD
userRepository.SaveChanges();
// perhaps other CRUD
roleRepository.SaveChanges();
Вместо этого сделайте это:
class UserRepository
{
private readonly MyContext _context;
public UserRepository(MyContext context)
{
_context = context;
}
}
class RoleRepository
{
private readonly MyContext _context;
public RoleRepository(MyContext context)
{
_context = context;
}
}
...
using (var context = new MyContext())
{
var userRepository = new UserRepository(context);
var roleRepository = new RoleRepository(context);
// CRUD
context.SaveChanges();
}
Контекст (или Единица работы) всегда находится на уровне выше репозиториев, должен создаваться снаружи и вводиться в репозитории.