将用户添加到角色会将重复的用户插入到users表中

Dej*_*jas 1 entity-framework ef-code-first

我首先使用Entity Framework代码为我的用户管理数据库后台存储.我有一个"添加用户角色"操作,它将用户从数据库中提取,将该用户添加到该角色,然后保存更改.但是,当我这样做时,用户的新副本将插入到数据库中,其中包含一个新的/不同的ID(唯一键),而不是我从数据库中提取的用户,我不知道为什么.有关为什么会发生这种情况的任何想法?

 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
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 5

只是一个猜测:你似乎有不同的ObjectContexts的_userRepository_roleRepository.通过加载usersToGiveRole_userRepository您附加到此上下文.selectedRole似乎与其他背景有关_roleRepository.当您添加userselectedRole.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();
Run Code Online (Sandbox Code Playgroud)

而是这样做:

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();
}
Run Code Online (Sandbox Code Playgroud)

上下文(或工作单元)始终高于存储库,应在外部创建并注入到存储库中.