2012-01-31 6 views
0

this質問Objectsは複数の外部キーで接続されていますが、毎回別のコンテキストを使用して読み込まれているため、外部キーを持つオブジェクトの保存に問題がありました。たとえば: Entity Frameworkコンテキストをコード内で常に再利用できますか?

using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { 
     IQueryable<Konsultanci> listaKonsultantow = from k in context.Konsultancis 
           select k; 

    } 

が次にどこかのコードで contextより人のような多くのオブジェクトタイプを取得するために使用さがあるだろう、トレーニングは、あなたはそれに名前を付けます。

そして、それを保存するためのコード(簡体字)が存在することになる。通常、それを保存しようとした後、複数のエラーメッセージ

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

または

The relationship between the two objects cannot be defined because they are attached to different ObjectContext objectsがあるだろう

 using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) { 
      if (context.Szkolenies.Any(t => t.SzkolenieID == currentSzkolenie.SzkolenieID)) { 
       context.Szkolenies.Attach(currentSzkolenie); 
       context.ObjectStateManager.ChangeObjectState(currentSzkolenie, EntityState.Modified); 
      } else { 
       context.Szkolenies.AddObject(currentSzkolenie); 
      } 
      context.SaveChanges(); 


     } 

などがあります。

それを解決するために、私はprivate EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM);をクラスの上に宣言し、それをusingに入れずにすべて再利用しました。この行動のおかげで、私は何かを保存する前に何かを付ける必要はありませんでした。私はちょうど同じ文脈を使っていて、currentUczestnik.Szkolenie = szkolenie;とcurrentUczestnik.Konsultanci = consultants;を使って、私が望む任意の外部キーを添付していました。それは問題なく保存されました。それは私が今、それがovercomplicatedではありません持っている小さなGUIのために働く

:質問へ

。しかし、もし私がマルチスレッドを導入すれば、同じContextを使って、さまざまなオブジェクト(GUI、ListViewなどのオブジェクトをロードする)の場所から複数の値を取得しようとしますか?私をひどく傷つけることはないでしょうか?基本的に私はSQLに接続したいすべての単一の時間のために使っていた

 const string preparedCommand = @"SELECT ID FROM TABLE WHERE NAME = "TEST""; 
     using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
     using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) 
     using (SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader()) 
      while (sqlQueryResult.Read()) { 
       string id= sqlQueryResult["id"].ToString(); 
      } 
     } 

を:私の古いコードで

は私が使っていたEntity Frameworkを知ったの前に。接続がない場合は確立され、接続があれば再利用され、マルチスレッドには問題はありません。

誰かが私がそれが動作することがわかったようにそれをすることから期待できる問題を教えてもらえますか?それとも、それを行うには最良の方法でしょうか?

+0

[This](http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392)は、なぜ単一のビジネスユニット以外のコンテキストを使用すべきではないかを説明できます。作業(単一スレッド論理ビジネス操作)。 –

答えて

2

しかし、私はマルチスレッドを導入した場合、同じコンテキストを使用して( リストビューなどに、GUIにロードオブジェクト)のすべての異なるオブジェクトのための場所以上から を複数の値を取得しようと何?私は酷いことを私に吹き返してくれるのではないでしょうか

はい、はいです。コンテキストは、基本的にはデータベース接続の上にある薄いレイヤーです。スレッドセーフではないため、スレッド間で同じコンテキストを再利用することはできません。あなたが探しているのは、同じコンテキストを使用する作業単位ですが、その作業単位が完了するとコンテキストを破棄します。独自のリポジトリー実装を使用するので、それらのリポジトリーの上に作業単位を構築する必要があります。

関連する問題