2011-04-28 4 views
1

사용자의 데이터베이스 백 스토어를 관리하기 위해 먼저 Entity Framework 코드를 사용하고 있습니다. "사용자에게 역할 추가"작업을 수행하여 db에서 사용자를 끌어오고 해당 사용자를 역할에 추가 한 다음 변경 사항을 저장합니다. 그러나이 작업을 수행 할 때 사용자의 새로운 복사본이 데이터베이스에서 db (또는 고유 키)를 가져온 사용자와 다른 새 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 

답변

5

그냥 추측 : 당신은 _userRepository_roleRepository에 대해 별도의 ObjectContexts을 갖고있는 것 같다. _userRepository에서 usersToGiveRole을로드하면이 컨텍스트에 연결됩니다. selectedRole_roleRepository의 다른 문맥에 붙어있는 것으로 보입니다. userselectedRole.UsersWithRole에 추가하면이 두 번째 컨텍스트에 추가됩니다 (user_roleRepository의 컨텍스트에서 added 상태에 있음). 이제이 컨텍스트의 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(); 
} 

컨텍스트 (또는 작업 단위)는 항상 저장소 위의 수준이며, 외부에서 만들어서 repos에 주입해야합니다.

+0

네, 그게 전부입니다. 정말 고마워! – Dejas

관련 문제