实体框架代码第一个表关系

时间:2017-02-16 07:52:01

标签: c# .net entity-framework database-design entity-framework-6

我有一个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();
}

我有什么想法可以解决这个问题吗?

1 个答案:

答案 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();
}