Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 将用户添加到角色会将重复用户插入到用户表中_Entity Framework_Ef Code First - Fatal编程技术网

Entity framework 将用户添加到角色会将重复用户插入到用户表中

Entity framework 将用户添加到角色会将重复用户插入到用户表中,entity-framework,ef-code-first,Entity Framework,Ef Code First,我首先使用实体框架代码为我的用户管理后台数据库。我有一个“将角色添加到用户”操作,该操作从数据库中提取用户,将该用户添加到角色,然后保存更改。但是,当我执行此操作时,会将用户的新副本插入到数据库中,其ID(唯一密钥)与我从数据库中提取的用户不同,我不知道为什么。你有没有想过为什么会这样 IEnumerable<long> usersIdsToGiveRole = from u in vm.UsersNotInSelectedRole where u.IsSelected selec

我首先使用实体框架代码为我的用户管理后台数据库。我有一个“将角色添加到用户”操作,该操作从数据库中提取用户,将该用户添加到角色,然后保存更改。但是,当我执行此操作时,会将用户的新副本插入到数据库中,其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
IEnumerable usersIdsToGiveRole=来自vm.UsersNotSelectedRole中的u,其中u.IsSelected选择u.Id;//比如说,产生“5”
IEnumerable usersToGiveRole=_userRepository.InternalUsers.Where(u=>usersIdsToGiveRole.Contains(u.ID));//获取ID为5的用户
foreach(usersToGiveRole中的var用户)
{
selectedRole.UsersWithRole.Add(用户);
}
_roleRepository.SaveChanges();//创建ID为6的新用户克隆用户5的所有其他字段

只是一个猜测:您似乎对
\u userRepository
\u roleRepository
有单独的对象上下文。通过从
\u userRepository
加载
usersToGiveRole
,您可以附加到此上下文
selectedRole
似乎附加到
\u roleRepository
的其他上下文。将
用户
添加到
selectedRole.UsersWithRole
时,您将其添加到第二个上下文中(
用户
现在在
\u角色还原
的上下文中处于
添加
状态)。现在,当您调用此上下文的
SaveChanges
时,将在数据库中创建一个新的用户对象

解决方案:确保两个存储库中只使用一个上下文

编辑

简而言之,我的意思是:

不要这样做:

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();
}
改为这样做:

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();
}

上下文(或工作单元)总是在存储库之上的一个级别,应该在存储库外部创建并注入到存储库中。

只是一个猜测:对于
\u userRepository
\u roleRepository
,您似乎有单独的ObjectContext。通过从
\u userRepository
加载
usersToGiveRole
,您可以附加到此上下文
selectedRole
似乎附加到
\u roleRepository
的其他上下文。将
用户
添加到
selectedRole.UsersWithRole
时,您将其添加到第二个上下文中(
用户
现在在
\u角色还原
的上下文中处于
添加
状态)。现在,当您调用此上下文的
SaveChanges
时,将在数据库中创建一个新的用户对象

解决方案:确保两个存储库中只使用一个上下文

编辑

简而言之,我的意思是:

不要这样做:

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();
}
改为这样做:

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();
}

上下文(或工作单元)总是在存储库之上的一个级别,应该在外部创建并注入回购协议。

是的,就是这样。非常感谢!是的,就是这样。非常感谢!