2013-11-27 4 views
1

저는 EF를 처음 사용하고 있으며 자녀들에게 약간의 문제가 있습니다. 엔티티 객체의 인스턴스를 저장할 수는 있지만 엔티티와 관련된 자식을 저장하려고하면 나에게 불어납니다. enter image description here엔티티 프레임 워크 저장 자식

현재 작업중인 모델입니다.

public bool UpdateSelectedUser(user selectedUser) 
    { 
     nsdc_supplyEntities ctx = new nsdc_supplyEntities(); 

     try 
     { 
      user editUser = ctx.users 
       .Include(ug => ug.network_group) 
       .Where(u => u.id == selectedUser.id).FirstOrDefault(); 

      editUser.full_name = selectedUser.full_name; 
      editUser.office_phone = selectedUser.office_phone; 
      editUser.cell_phone = selectedUser.cell_phone; 
      editUser.home_phone = selectedUser.home_phone; 
      editUser.text_address = selectedUser.text_address; 
      editUser.email = selectedUser.email; 

      foreach (network_group group in selectedUser.network_group) 
      { 
       editUser.network_group.Add(group); 
      } 

      ctx.SaveChanges(); 
     } 
     catch (Exception e) 
     { 
     } 
    } 

코드를 사용하고 있습니다. editUser.network_group.Add(group); 행에서 "두 객체 간의 관계가 다른 ObjectContext 객체에 연결되어있어 정의 할 수 없습니다"라는 오류가 발생합니다. Google과 SO에 대한 잠재적 인 답변을 조금 파고 들었지만 지금까지 문제를 해결하는 방법을 찾지 못했습니다.

-UPDATE- 포주의 그룹이 수주의 제안을 반영하도록 변경되었습니다. 그것은 더 멀리 함께있어하지만 또 다른 문제를 노출 :

  foreach (network_group group in selectedUser.network_group) 
      { 
       var groupEntity = new network_group 
       { 
        id = group.id, 
        full_name = group.full_name, 
        distribution_list_email = group.distribution_list_email 
       }; 
       if (editUser.network_group.Where(g => g.id == groupEntity.id).Count() < 1) 
       { 
        editUser.network_group.Add(groupEntity); 
       } 
      } 

오류가 발생했습니다 고유 한 제약이 있습니다. 일부 중복 된 항목을 삽입하는 것으로 나타났습니다. 따라서 사용자가 이미 그룹을 가지고 있다면 추가하지 않습니다. 그러나 이제는 사용자와 현재 연결되지 않은 그룹 만 추가하기 때문에 고유 제약 조건 오류가 발생합니다. 내가 발견 한 것은 그룹 테이블에 새 그룹을 추가 한 다음 사용자와 연관시키는 것입니다. 새 그룹을 만들지 않고 기존 그룹을 사용자에게 추가하고 싶습니다. 가까이와! :)

+0

첫 번째 문장에 대해서는 parenting.stackexchange.com을 참조하십시오. –

답변

1

방금 ​​만든 컨텍스트의 엔티티와 다른 컨텍스트에서 이미 만든 엔티티를 추가하기 때문에 원래 오류가 발생합니다.

// Get the ids 
var userGroupIds = selectedUser.network_groups.Select(e => e.id); 

// Use the ids to retrieve their equivalent entities from the new context 
var userGroups = ctx.network_groups.Where(e => userGroupIds.Contains(e.id)); 

// Add the groups from the correct context. 
foreach (network_group group in userGroups) 
{ 
    editUser.network_group.Add(group); 
} 
1

문제가 해결 될 수도 있습니다. 새 network_group1 개체를 만들고 속성 값을 설정하고 컬렉션에 추가하십시오.

foreach (network_group group in selectedUser.network_group) 
{ 
    var groupEntity=new network_group { id=group.id,full_name=group.ful_lname 
         ,distribution_list_email=group.distribution_list_email}; 
    editUser.network_group.Add(groupEntity); 
} 
ctx.SaveChanges(); 
+0

내가 손을 잡고있을 때 그룹의 다른 인스턴스를 만들어야하는 이상한 것처럼 보입니다. 그것은 더 이상 그 라인에 오류가 아니지만 새로운 문제에 대한 설명은 OP의 업데이트를 참조하십시오. 그것이 새로운 그룹을 만들려고 노력하는 그룹의 새로운 인스턴스를 만들고 있기 때문에 그것이 궁금합니다. – Jeremy

0

가장 쉬운 방법은 있는지 확인하는 것입니다 selectedUser (따라서 그 network_group을)가 현재 속해있는 컨텍스트에 연결되어 있지 않습니다. 그런 다음 원래 코드에서와 같이 그룹을 새 editUser에 추가 할 수 있습니다.

관련 문제