私はC#アプリケーションを使用して、私のアプリケーションに不動産業者のリストやエージェントのXMLデータを提供するWeb APIに接続します。私はEntity Frameworkの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は、これらの線に沿って何かを探します。だから私はこの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; }
}
を、それがエージェントとのリスティング間の多対多の関係です。したがって、1つのエージェントには、彼に関連付けられた0件以上のリスティングがあり、1件のリスティングには0以上のエージェントが関連付けられています。
私のアプリは最初のタグのすべてのエージェントを読み込み、すべてのエージェントをエージェントテーブルに挿入します。その後、すべてのリスティングを読むと、EFがそれらのエージェントを再度作成しようとしているように見えます。明らかに、同じIDを持つ第2のエージェントを再び追加しようとしているので、PRIMARY KEY違反エラーが発生します。
私は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();
}
私はこれにどのように取り組むことができますか?
リストを処理し、関連するコードを記載してください。また、エージェントとリストを挿入するために同じ 'DbContext'インスタンスを使用するかどうかを指定します。 –
返信Ivanに感謝します。私は1つのDbContextのみを使用しています。基本的に、私のXML解析ルーチンは、エージェントのコレクションとリストのコレクションを持つ "スナップショット"クラスを返します。次に、Agents and Listingsコレクションをループし、各アイテムをdbContextに追加し、最後にdbContext.SaveChanges()を呼び出します。 – user1900799
上記の私のリスティングクラスでは、私は次のように置き換えようと思います: * public virtual ICollectionエージェント{get;セット; } * と * public仮想ICollection AgentRefs {get;セット; } * XMLをよりよく反映します。しかし、これは、EFがそれを正しく実行し、Listings-Agentsブリッジングテーブルを作成するために必要なナビゲーションプロパティを作成しませんでしたか? –
user1900799