2011-04-11 4 views
1

entityframework 코드를 먼저 사용하여 링크 테이블에 새 레코드를 추가하려고합니다. 내가 가지고있는 것은 UserRole에 대한 많은 것입니다. 그래서 완벽하게 그들을 제거엔티티 프레임 워크가 많을수록 많은 레코드가 계속 추가됨

//Delete all associated roles for user 
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var usersRoles = roleUser.Roles; 

usersRoles.ForEach(role => roleUser.Roles.Remove(role)); 

//add the new roles 
roleUser.Roles.AddRange(detachedUser.Roles); 

db.SaveChanges(); 

: 나는이 시나리오는 내가 사용자에 대한 역할을 변경있을 때, 나는 모든 이전 역할을 삭제하고 다음과 같이 새로운 역할을 추가한다는 것입니다. 그러나 새 역할을 추가 할 때 링크 테이블에 추가 할뿐만 아니라 Role 테이블에도 추가합니다. RoleName없이 완전히 새로운 역할이 추가되었습니다. 어떻게 EF 완전히 새로운 기록을 추가하는 것을 방지 할 그냥 링크 테이블에 레코드를 추가

RoleId;//1 <-- this Id exists in the database already but yet still it creates one instead of a linktable record. 
RoleName;//null 

: user.Roles는 다음과 같은 데이터 항목을 포함 할 것인가?

업데이트 : 내가이 일을 결국 : 사용자에게 새 역할을 추가하기 전에 저장

var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var roles = db.Roles; 

foreach (var role in roles) 
{ 
    if (user.Roles.Any(r => r.RoleId == role.RoleId)) 
    { 
      roleUser.Roles.Add(role); 
    } 
    else 
    { 
     roleUser.Roles.Remove(role); 
    } 
} 
db.SaveChanges(); 
+0

분명히 해결되었지만 해결할 수없는 것을 이해할 수 없습니다. 새로운 역할을 만들지 못하게하는 부분을 다시 게시하십시오. – Mounhim

답변

2

시도

//Delete all associated roles for user 
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var usersRoles = roleUser.Roles; 

usersRoles.ForEach(role => roleUser.Roles.Remove(role)); 
db.SaveChanges(); 

roleUser.Roles.AddRange(user.Roles); //add the new roles 
db.SaveChanges(); 

편집 :

이에서보세요 :

roleUser.Roles.AddRange(user.Roles); //add the new roles 

여기서 user.Roles은 어디서 오나요?

+0

두 번째 SaveChanges를 추가 한 후에도 여전히 동일한 문제가 발생합니다. –

+0

새로운 역할을 추가하는 방식으로 생각합니다. 이와 같은 문제가 발생할 경우 데이터베이스에서 모두 가져와 –

+0

을 추가해야 할 수도 있습니다. 바인딩 구성을 살펴볼 수도 있습니다. 과거에는 이런 문제가있었습니다. –

0

추가 한 롤마다 엔티티 상태를 확인하거나 설정할 수 있습니다. 예를 들어 여기서는 세트를 unchaged로 설정합니다. 이렇게하면 삽입하거나 업데이트하려고 시도하지 않습니다. 여기

myContext.Entry(roll).State = EntityState.Unchanged 

상세 정보 : http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

+0

사실,하지만 새로운 역할을 추가하기 전에 저장 한 경우, 엔티티의 상태는 변경되지 않습니다. (저장 후) –

1

나는 당신이 가지고있는 문제는 당신이 사용자에 추가하기 전에 당신의 역할을 첨부 할 필요가 있다고 생각합니다.

또한 모두 제거 할 필요는 없습니다. 제거 된 것을 제거한 다음 새 것을 추가하기 만하면됩니다.

+0

나는 오직 @moi_meme에 동의합니다. 제거해야 할 항목을 제거해야합니다. 다른 한편, 나는 이것이 분리 된/탈착 된 국가들을 만진 문제는 아니라고 생각한다.그 이유는 물체들이 분리되지 않기 때문이다. –

+0

@Alexandre Brisebois - 나는 그의 변수 때문에 DetachedUser –

+0

라고 불렀다. 나는 그 부분을 발견하지 못했다. –

관련 문제