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)
只是一个猜测:你似乎有不同的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();
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)
上下文(或工作单元)始终高于存储库,应在外部创建并注入到存储库中.