2009-03-17 4 views
0

私は3つのエンティティEntity Frameworkを使用して関連する複数のエンティティをdbに挿入すると、何が間違っていますか?

  • プリンタを持って
  • サーバー
  • プリンタがサーバーとドライバのプロパティ

    Somwhereは私のコードで私はIEnumerableを<設定している

ドライバープリンタ>ここで、プリンタの各インスタンスには、独自のServerおよびDriverエンティティが保持されています。

今、私はデシベルに提出しようとしているとき、私は次のコードを使用しています:

foreach (Printer p in printers) 
    { 
    printmanEntities _dc = new printmanEntities(); 
    p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver; 
    p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server; 

    _dc.AddToPrinterSet(p); 

    _dc.SaveChanges(); 
    } 

を私は、各プリンタオブジェクトのレコード、および単一のレコードを取得しますことを想定しています一意のドライバとサーバー名ごとにしかし、実際の結果はかなり有線です。

上記のコードは、それぞれの固有のドライバオブジェクトのための単一のレコードを生成するが、明白な理由のために、それぞれ独自のサーバーに複数のレコードを作成します。また、すべてのプリンタレコードは単一のサーバーレコードを指します。私が最初にp.Serverを割り当てると

はさらに、その後、私は、サーバーのエンティティのためのユニークな記録が、ドライバのエンティティのための複数のレコードのみを取得します。

私は間違っていますか?

アップデート:私は予想通りとLINQ2SQLとEF置き換えは、それだけで働きました。一意のエンティティごとに1行、それ以上はありません。

答えて

0

奇妙なことに、データコンテナを使用すると、グラフに添付エンティティを返しませんが、クエリの結果として、DBへのコミットしませんでした。したがって、追加したエンティティは取得できませんが、Select()では許可されていません。 ) - :

0

これはdc.ServerSet.FirstOrDefault(S => s.Name == p.Server.Name)がnullを返すされていますが、ドライバの呼び出しは、レコードを返すことを示唆しています。どうして?知りません。 SQLプロファイラを見て、DBサーバーから戻ってくるものを見てください。あなたの結果を説明します。

更新:ここで何が起こっているのか分かりました。次のようにコードを変更してください。それがうまくいくならば、その理由を説明します。

printmanEntities _dc = new printmanEntities(); 
_dc.AddToPrinterSet(p); 

p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver; 
p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server; 

_dc.SaveChanges(); 

私がここで行った唯一の操作は、操作の順序を変更することでした。

+0

適切な値が返され、dbテーブル内のすべてのプリンタが適切なサーバーにリンクされていると見なされます。 私はちょうど有線のバグを見つけたと思います。 –

+0

他に何かが続いています。私はこの例から何が言えるのかは分かりませんが、Entity Frameworkがこのようなことを間違って行ったことはありませんでした。 –

+0

この更新されたコードをお試しください。 –

関連する問題