2011-08-07 8 views
0

私は、新しいエンティティフレームワーク4のエンティティを参照して、別のエンティティ、単純なユーザーレコードを持っています。入力データには、同じ人物の複数のユーザーレコードがある場合があります。その人物はデータベースに存在しないかもしれません。そうでない場合は、新しいユーザーエンティティを作成して追加する必要があります。ASP.NET EF4:重複する参照エンティティを追加する

ユーザーを参照するメインエンティティを作成するときに、データベース内のそのユーザーのクイックルックアップを実行します。その人が存在すれば、偉大な、私は設定するための参照を得た。そうでない場合は、新しいユーザーレコードを作成し、メインエンティティの参照を新しく作成したユーザーエンティティに設定します。より多くのレコードを処理すると、同じユーザーがポップアップすることがあるので、「新規ユーザーの作成」機能でクエリを実行すると、新しく作成されたがまだ保存されていないエンティティが存在する場合、しかし、明らかにそうではありません(確かに愚かな仮定)...最終結果は、その主なエンティティにリンクされたそのユーザーの重複レコードが作成され、すべて保存されると、 "SQLエラー2601:Can notユニークインデックス 'IX_user_table'を持つオブジェクト 'dbo.user_table'に重複キー行を挿入してください。 "エラー。

私はこの状況をどのように解決するのかちょっと困惑しています。問題は、新しいユーザーエンティティを追加した直後にコンテキスト上でSaveChanges()を呼び出せないことです。これは、エンティティグラフ全体が保存され、ユーザーレコードを参照している主エンティティがまだ完了していないためです。保存する準備ができていないので、私は新しいユーザーを追加するたびにすべての混乱を保存することはできません。私はすべてのエンティティを構築し、すべてをワンショットで保存する必要があります。

私は、データベースとのようなものなものに1、2つのクエリ私は、ユーザーを検索するたびに行う必要があります:私は本当にそうエンティティ状態管理の内部いじっていない

var unsavedVisitors = from c in 
    dataContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) 
    where c.Entity is my_table 
    select c.Entity; 

ここで何をすべきかわかりません - 入力データをループするときに作成している新しいメインエンティティにリンクすることができる既存の未保存のユーザーエンティティを見つけるためにクエリを実行するにはどうすればよいですか?それは私がちょうどmy_table型とwalaに上記のc.Entityをキャストできるように見えます、私は私の参照を持っています。保存されていないエンティティを非常に多くのクエリで処理するのを避けるために、「クエリに保存されていないエンティティを含める」というトリックな何かがあったらいいですか?

+0

同じASP.NETリクエストから繰り返しルックアップを実行していますか? –

+0

はい、私は、1から90までのレコードのどこかにデータの塊が入っているので、すべての検索を繰り返しています。だから私の文脈はすべてのルックアップと同じです。 –

+0

しかし、私は別のスレッドから別のオブジェクトコンテキストを見ることができるかどうかは非常に不思議でした。つまり、2つの要求が同時に来て、それぞれが別のコンテキストをインスタンス化し、ObjectStateManagerを照会すると(同じテーブルタイプであっても)別のスレッドから追加されたオブジェクトを表示していないのですか?だから私はまだいくつかの同時実行性の問題があるかもしれませんが、私は2つの異なるスレッド(コンテキスト)から同じユーザーを追加すると実際の同時実行例外が発生すると仮定します。 –

答えて

1

いいえ、「保存されていないエンティティをクエリに含めます」というトリックはありません。 ObjectStateManagerのエントリをチェックするのは正しい方法です。あるいは、追加した新しいユーザーをカスタムディクショナリで管理することもできますが、基本的にはObjectStateManagerを利用するのと同じです。最後の選択肢は、何らかの形でユーザーのコレクションを最初から複製オブジェクトからクリーンアップすることです。

+0

ありがとう、それらは興味深い提案です。自分のリストを作成して追加するのではなく、追加されたエンティティ(これは素晴らしい)でクエリを実行するのが最も簡単だと私は同意します。残念ながら、私はそれを制御することができないので入力をクリーンアップすることはできませんが、それは "V2.0"で修正できるものです。 –

関連する問題