Entity framework 将用户添加到角色会将重复用户插入到用户表中
我首先使用实体框架代码为我的用户管理后台数据库。我有一个“将角色添加到用户”操作,该操作从数据库中提取用户,将该用户添加到角色,然后保存更改。但是,当我执行此操作时,会将用户的新副本插入到数据库中,其ID(唯一密钥)与我从数据库中提取的用户不同,我不知道为什么。你有没有想过为什么会这样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
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();
}
上下文(或工作单元)总是在存储库之上的一个级别,应该在外部创建并注入回购协议。是的,就是这样。非常感谢!是的,就是这样。非常感谢!