Добавление пользователя в роль вставляет дубликата пользователя в таблицу пользователей - PullRequest
1 голос
/ 28 апреля 2011

Сначала я использую код Entity Framework для управления хранилищем базы данных для моих пользователей.У меня есть операция «добавить роль пользователю», которая извлекает пользователя из БД, добавляет этого пользователя в роль, а затем сохраняет изменения.Однако, когда я делаю это, новая копия пользователя вставляется в базу данных с новым / другим идентификатором (уникальным ключом), чем пользователь, которого я извлек из базы данных, и я не уверен, почему.Есть мысли о том, почему это происходит?

 IEnumerable<long> usersIdsToGiveRole = from u in vm.UsersNotInSelectedRole where u.IsSelected select u.Id; // say, yields "5"
 IEnumerable<User> usersToGiveRole = _userRepository.InternalUsers.Where(u => usersIdsToGiveRole.Contains(u.ID)); // gets user with ID 5
 foreach (var user in usersToGiveRole)
 {
       selectedRole.UsersWithRole.Add(user);
 }


 _roleRepository.SaveChanges(); // creates new user with ID 6 cloning all other fields of user 5

1 Ответ

5 голосов
/ 28 апреля 2011

Просто предположение: у вас, кажется, есть отдельные 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();
}

Контекст (или Единица работы) всегда находится на уровне выше репозиториев, должен создаваться снаружи и вводиться в репозитории.

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