2014-07-25 8 views
0

자, 이제 며칠 동안 내 머리카락을 풀어 왔습니다.EF 개체를 외래 키로 추가

엔티티 프레임 워크가 완전히 새로운 개체가 아닌 기존 개체에 외래 키로 개체를 삽입하도록 지시하려면 어떻게해야합니까? 나는 모든 종류의 것을 시도했다. "동일한 키를 가진 객체가 이미 ObjectStateManager에 존재하며, ObjectStateManager는 동일한 키를 가진 여러 객체를 추적 할 수 없습니다."라는 오류가 계속 나타납니다.

저는 주소에 국가를 추가하려고합니다. 국가는 모두 별도의 데이터베이스 테이블에 나열됩니다. 해당 국가는 MVC보기에서 게시 된 드롭 다운 목록에서 제공되므로 ID 만 있습니다. 즉, 개체를 얻을 수있는 유일한 방법은 EF를 쿼리하여 중복 된 개체가 생성된다는 것입니다.

누군가가 도움을 줄 수 있기를 바랍니다. 아아 그!

M

=== 추가 정보 ===

위에서 아주 정확하게 바로 countryID, 시나리오를 만들고이 유일한 작품 설정에 지적하면서. 편집을 위해 작동하지 않습니다.

나는 내 컨트롤러이 있습니다

public ActionResult Edit(SiteViewModel siteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Site site = _unitOfWork.SiteRepository.GetById(siteViewModel.SiteID); 
      _unitOfWork.Detach(site); 
      site = Mapper.Map<SiteViewModel, Site>(siteViewModel); 
      site.CountryId = siteViewModel.CountryId; 
      ... 
     } 
    } 

나는 여전히 지금 같은 키 오류로 여러 개체를 얻고있다. 국가를 분리하여 데이터베이스에서 제거하지 않고 다시 추가 할 수 있도록하려면 어떻게해야합니까 ??

도와주세요!

M

+0

'국가'와 '주소'항목을 게시 하시겠습니까? –

답변

0

시도 :

var id = 2; // id of item 

using (var context = new Context()) 
     { 
      var item = context.YourTable.Single(m => m.Id== id); 

      item.ForeinKey = someNewForeinKey; 

      context.SubmitChanges(); 
     } 
+0

답변 해 주셔서 대단히 감사합니다. 위의 자세한 내용을 참조하십시오. – serlingpa

1

주소로 국가를 연결하는 가장 저렴한 방법은 당신이 다음 주소로 첨부 나라를 대표하는 스텁을 사용하는 것입니다. 기존 국가를 편집하지 않고 첨부하려는이 시나리오에서는 데이터베이스로의 왕복을 피할 수 있습니다.

예.

address.CountryId = postedId; 

엔티티 프레임 워크 : - 코멘트에 이안 갤러웨이에서 언급 한 바와 같이

// Create stub country using posted country id 
var country = new Country { Id = postedId }; 

// Attach (NOT ADD) to context as an existing entity 
// (Using Add would lead to an EntityState of Added and a violation of the 
// PK unique constraint as per the question) 
context.Countries.Attach(country) 

// This assumes the address is attached to the context 
// I.e. either its been Added to the Address DbSet 
// or returned from a query on the Address DbSet 
address.Country = country 
context.SaveChanges(); 

것은, 경우 주소는 다음과 같이> 국가 관계는 외래 키 ID 속성은 또한 동일을 달성 할 수있다 DetectChangesSaveChanges 메서드를 통해 호출되고 모든 탐색 속성이 올바르게 설정되었는지 확인하면 관계 픽스 업이 수행됩니다.

+2

모델에 'address.CountryId'가 설정되어 있다면 간단히 설정할 수 있습니다. –

+0

매우 좋은 점 - 이에 따라 업데이트됩니다. –

0

ForeignKey 속성을 사용하십시오. 그렇게하면 전체 객체를 갖는 대신 ID를 할당 할 수 있습니다. 클래스에 int 속성을 포함시키고 int 속성이 외래 키를 나타내는 속성을 사용하여 탐색 속성을 꾸미기 만하면됩니다.

관련 문제