저는 부동산 중개사 목록 및 에이전트에 대한 일부 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에있는 경우
이 목록을 처리하는 관련 코드를 기입하십시오. 또한 에이전트와 목록을 삽입하기 위해 하나의 'DbContext' 인스턴스를 사용하는지 지정하십시오. –
답장을 보내 주셔서 감사합니다. 하나의 DbContext 만 사용하고 있습니다. 기본적으로 XML 파싱 루틴은 에이전트 모음과 목록 모음이있는 "스냅 샷"클래스를 반환합니다. 그런 다음 Agents and Listings 컬렉션을 순환하여 각 항목을 dbContext에 추가하고 마지막에는 dbContext.SaveChanges()를 호출합니다. – user1900799
위 목록의 클래스에서 다음을 대체하려고합니다. * public virtual ICollection Agents {get; 세트; } * 과 * public 가상 ICollection AgentRefs {get; 세트; } * XML을 더 잘 반영합니다. 그러나 이것은 EF가 일을 제대로하고 Listings-Agents 브리징 테이블을 만드는 데 필요한 네비게이션 속성을 생성하지 않습니다. –
user1900799