【问题标题】:Adding user to a role inserts a duplicate user into users table将用户添加到角色会将重复的用户插入用户表
【发布时间】:2011-04-28 18:09:26
【问题描述】:

我首先使用 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

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    只是一个猜测:您似乎对 _userRepository_roleRepository 有单独的 ObjectContexts。通过从 _userRepository 加载 usersToGiveRole 您附加到此上下文。 selectedRole 似乎附加到 _roleRepository 的另一个上下文中。当您将user 添加到selectedRole.UsersWithRole 时,您会将其添加到第二个上下文(user 现在在_roleRepository 的上下文中处于added 状态)。现在,当您调用此上下文的 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();
    }
    

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

    【讨论】:

    • 是的,就是这样。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多