0

私は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(); 
} 

私はこれにどのように取り組むことができますか?

+0

リストを処理し、関連するコードを記載してください。また、エージェントとリストを挿入するために同じ 'DbContext'インスタンスを使用するかどうかを指定します。 –

+0

返信Ivanに感謝します。私は1つのDbContextのみを使用しています。基本的に、私のXML解析ルーチンは、エージェントのコレクションとリストのコレクションを持つ "スナップショット"クラスを返します。次に、Agents and Listingsコレクションをループし、各アイテムをdbContextに追加し、最後にdbContext.SaveChanges()を呼び出します。 – user1900799

+0

上記の私のリスティングクラスでは、私は次のように置き換えようと思います: * public virtual ICollection エージェント{get;セット; } * と * public仮想ICollection AgentRefs {get;セット; } * XMLをよりよく反映します。しかし、これは、EFがそれを正しく実行し、Listings-Agentsブリッジングテーブルを作成するために必要なナビゲーションプロパティを作成しませんでしたか? – user1900799

答えて

0

エージェントがすでにEFコンテキストにエージェントを取り付けることにより、その旨をお伝えしなければならないDBに存在する場合:

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

ありがとうございました。私は今これを得る:) 同じタイプの別のエンティティがすでに同じプライマリキー値を持っているため、 'エージェント'タイプのエンティティをアタッチできませんでした。これは、「Attach」メソッドを使用するか、またはグラフ内のエンティティのいずれかが競合するキー値を持つ場合、エンティティの状態を「Unchanged」または「Modified」に設定すると発生します。これは、一部のエンティティが新しく、データベース生成キー値をまだ受け取っていないことが原因です。この場合、 '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フォーラム= adodotnetentityframework – user1900799

関連する問題