2013-03-05 3 views
0

내가 엔티티 프레임 워크 4.4을 사용하고 있는데이 같은 일대 다 관계의 모델이 : 나는 같은 B 인스턴스 2 개 인스턴스 모두가 가정하면, 이제컨텍스트를 처리하는 객체를 올바르게 추가하는 방법은 무엇입니까?

class A { 
    public int Id { get; set; } 
    public virtual B { get; set; } 
    public int BId; 
} 
class B { 
    public Id { get; set; } 
    private ICollection<A> _As; 
    public virtual ICollection<A> As 
    { 
     get { return _As ?? (_As = new HashSet<A>()); } 
     protected set { _As = value; } 
    } 
} 

합니다.

foreach (var a in LocalAList) 
{ 
    dbContext.Add(a); 
    dbContext.SaveChanges(); 
} 

문제는 : 나는 다음 인스턴스 내 현재 목록을주기는 DB 컨텍스트에 추가 할

A: { Id: 1, BId: 1, B: { Id: 1, As: [ 1, 2 ] } } 
A: { Id: 2, BId: 1, B: { Id: 1, As: [ 1, 2 ] } } 

: 그럼이 (JSON 표현) 같은이있을 것이다 중복 객체를 삽입했다는 예외를 받았다. 나는 주위를 둘러 보았고 엔티티 수정과 첨부를 다루는 것을 발견했지만 여전히 EF에 상당히 익숙하다. 나는 이것이 전형적인 것이고 객체가 이미 존재하는 곳에 객체 삽입을 처리하는 관용구가 있다고 상상할 것이다.

중복 추가를 피하면서 컨텍스트에 새로운 개체를 효과적으로 추가하려면 어떻게해야합니까? 난 그냥 중복 예외를 캡처하고 그것을 무시해야합니까? 확인하는 더 좋은 방법이 있습니까?

+0

는'Id's 데이터베이스 생성 정체성 있습니까? 그리고 정확히 어떤 예외가 있습니까? 기본 키 제약 조건 위반에 대한 예외는 무엇입니까? (이 경우에 데이터베이스 생성 ID를 가질 수 없다고 생각합니다.) 정확히 무엇을 삽입 하시겠습니까? 단지'A' 또는'B'입니까? 아니면'B'의 기존 엔티티이고 새로운'A'와 기존'B' 사이의 관계 만 만들고 싶습니까? – Slauma

+0

내 편집을 참조하십시오. ID는 생성 된 ID가 아닙니다. –

+1

솔직히, 나는 이제 더 이상 대답하지 않을 것이다. Mark Oreta의 답변을 공정하게하기 위해 편집을 이전 버전으로 롤백하고 수정 사항과 함께 새로운 질문을 작성하거나 Mark Oreta의 답변 아래에 질문을 변경했기 때문에 의견을 작성하여 조정할 기회를 주어야합니다 그의 대답. 질문의 변화가 너무 커서 그의 대답은 현재 더 이상 이해가되지 않습니다. – Slauma

답변

2

데이터베이스에 이미 존재하는지 확인하기 위해 간단한 테스트를 수행 할 수 있습니다. 가장 간단한 방법은 Id가 0인지 확인하는 것입니다. 이것은 DB에 A가 추가되면 ID가 사용자에게 주어지기 때문입니다 실재. 그 시점에서, 당신은 단지 그것을 다시 연결해야보다는 그것을 다시 추가

예 :

foreach (var a in LocalAList) 
{ 
    if (a.Id == 0) 
    dbContext.Add(a); 
    else 
    dbContext.As.Attach(a) 

    dbContext.SaveChanges(); 
} 
관련 문제