我有一个C#应用程序,它连接到一个Web API,为我的应用程序提供一些XML数据,用于房地产代理商列表和代理。
XML看起来像这样:
<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>
我决定使用Entity Framework 6.2,代码优先方法。所以我创建了这两个类:
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; }
}
正如您所看到的,它是代理和列表之间的多对多关系。因此,一个代理可以有零个或多个与他关联的列表,一个列表可以有零个或多个与之关联的代理。
因此,我的应用程序读取第一个标记中的所有代理,并将所有代理插入代理表。然后,稍后,当它读取所有列表时,看起来EF正在尝试再次创建这些代理。显然,这会产生PRIMARY KEY违规错误,因为它试图再次使用相同的ID添加第二个代理。
我正在使用XDocument来解析XML。这是我读取列表中的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();
}
我有什么想法可以解决这个问题吗?
答案 0 :(得分: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();
}