0

저는 부동산 중개사 목록 및 에이전트에 대한 일부 XML 데이터를 내 앱에 제공하는 웹 API에 연결하는 C# 앱을 보유하고 있습니다. 내가 엔티티 프레임 워크 6.2, 코드 첫 번째 방법을 사용하여 사용하기로 결정했습니다Entity Framework 코드 첫 번째 테이블 관계

<Snapshot> 
     <Agents> 
     <Agent id="838388" firstName="John" surname="Smith"/> 
     <Agent id="838389" firstName="Jane" surname="Doe"/> 
     <Agent id="838390" firstName="Mary" surname="Appleton"/> 
     <Agent id="838391" firstName="Peter" surname="Gill"/> 
     </Agents> 

     <Listings> 
     <Listing id="1737672" officeId="801948" agencyName="Century 21"> 
      <Agents> 
      <AgentRef id="838388" /> 
      <AgentRef id="838391" /> 
      </Agents> 
     </Listing> 

     <Listing id="1737673" officeId="801949" agencyName="Remax"> 
      <Agents> 
      <AgentRef id="838390" /> 
      <AgentRef id="838389" /> 
      </Agents> 
     </Listing> 
     </Listings> 
    </Snapshot> 

:

XML은 이러한 라인을 따라 뭔가를 보인다. 그래서이 두 클래스 생성 :

public class Agent 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int AgentId { get; set; } 
     public string FirstName { get; set; } 
     public string Surname { get; set; } 
     public virtual ICollection<Listing> Listings { get; set; } 
    } 

당신이 볼 수 있듯이

public class Listing 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.None)] 
     public int ListingId { get; set; } 
     public int OfficeId { get; set; } 
     public int AgencyName { get; set; } 
     public virtual ICollection<Agent> Agents { get; set; } 
    } 

를,이 에이전트와 리스팅 간 다 대다 관계이다. 따라서 하나의 상담원은 그에 연결된 0 개 이상의 목록을 가질 수 있으며 하나의 목록에는 0 개 이상의 상담원이 연관 될 수 있습니다.

그래서 내 앱은 첫 번째 태그의 모든 상담원을 읽고 모든 상담원을 상담원 테이블에 삽입합니다. 그런 다음 나중에 모든 목록을 읽을 때 EF가 해당 요원을 다시 만들려고하는 것 같습니다. 분명히 동일한 ID로 두 번째 에이전트를 다시 추가하려고 시도 할 때 PRIMARY KEY 위반 오류가 발생합니다.

XML을 구문 분석하기 위해 XDocument를 사용하고 있습니다. 이것은 내가 목록의 AgentRef 엘리먼트를 읽었을 때의 비트입니다 :

XElement root = xDoc.Root.Elements("Listings").Descendants("Listing"); 
if (root.Descendants("Agents").Any()) 
{ 
    List<string> agentRefs = root.Element("Agents").Elements("AgentRef") 
    .Select(a => a.Attribute("id").Value).ToList(); 
    listing.AgentRefs = agentRefs.Select(int.Parse).ToList(); 
} 

어떤 아이디어가이 문제를 해결할 수 있습니까? 에이전트가 이미 DB에있는 경우

+0

이 목록을 처리하는 관련 코드를 기입하십시오. 또한 에이전트와 목록을 삽입하기 위해 하나의 'DbContext' 인스턴스를 사용하는지 지정하십시오. –

+0

답장을 보내 주셔서 감사합니다. 하나의 DbContext 만 사용하고 있습니다. 기본적으로 XML 파싱 루틴은 에이전트 모음과 목록 모음이있는 "스냅 샷"클래스를 반환합니다. 그런 다음 Agents and Listings 컬렉션을 순환하여 각 항목을 dbContext에 추가하고 마지막에는 dbContext.SaveChanges()를 호출합니다. – user1900799

+0

위 목록의 클래스에서 다음을 대체하려고합니다. * public virtual ICollection Agents {get; 세트; } * 과 * public 가상 ICollection AgentRefs {get; 세트; } * XML을 더 잘 반영합니다. 그러나 이것은 EF가 일을 제대로하고 Listings-Agents 브리징 테이블을 만드는 데 필요한 네비게이션 속성을 생성하지 않습니다. – user1900799

답변

0

당신은 EF 상황에 에이전트를 부착하여 그에게해야합니다

using(var myContext = new MyContext) 
{ 
    var agent = new Agent() { AgentId = 838388 }; 
    myContext.Agents.Attach(agent); 

    var listing = new Listing() { ... }; 
    listing.Agents.Add(agent); 

    myContext.Listings.AddObject(listing); 

    myContext.SaveChanges(); 
} 
+0

감사합니다. Duy. 나는 이제 이것을 얻는다. 같은 유형의 다른 엔티티가 이미 동일한 기본 키 값을 가지고 있기 때문에 'Agent'유형의 엔티티를 연결하는 데 실패했다. 이것은 'Attach'방법을 사용하거나 그래프의 엔티티 중 하나가 충돌하는 키 값을 갖는 경우 엔티티의 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 이는 일부 엔티티가 새롭고 아직 데이터베이스 생성 키 값을 수신하지 않았기 때문일 수 있습니다.이 경우 'Add'메소드 또는 'Added'엔티티 상태를 사용하여 그래프를 추적 한 다음 비 신규 엔티티의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정하십시오. – user1900799

+0

나는 또한 그것을 여기에 게시했다. 아마 나는 그것을 약간 더 잘 설명 했을까? https://social.msdn.microsoft.com/Forums/en-US/8391bfc3-1e1c-4bf9-afe2-d6bfbfe4f638/entity-framework-trying-to-add-navigational-children-of-parent-class-twice ? forum = adodotnetentityframework – user1900799

관련 문제