2012-01-31 55 views
0

this問題我在保存具有外鍵的對象時遇到了問題,因爲Objects是通過外鍵相互連接的多個Objects構建的,但每次都使用不同的上下文加載它們。例如:實體框架上下文可以在代碼中一直重用嗎?

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

    } 

然後在其他地方的代碼將有更多的context用於獲取更多的對象類型,如人員,培訓,你的名字。

然後將有代碼來保存它(簡化):

 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(); 


     } 

試圖保存它後一般會有多個錯誤消息

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

和其他幾個人。

因此,爲了解決這個問題,我已經在我的課堂上宣佈了private EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM);,並且一直重複使用它,但沒有將其放入using。由於這一行動,我不必在儲蓄之前附加任何東西。我只是使用相同的上下文,並使用currentUczestnik.Szkolenie = szkolenie;和currentUczestnik.Konsultanci = consultants;來附加我想要的任何外鍵。它保存沒有問題。

的問題:

它適用於小的圖形用戶界面,我現在有沒有被過於複雜。但是如果我引入多線程,試圖從不同的對象(使用相同的上下文將對象加載到GUI,到ListView等)的所有地方得到多個值?難道它不會對我造成嚴重傷害嗎?

在我以前的代碼之前,我發現了實體框架我用的是:

 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(); 
      } 
     } 
基本上我是使用每一次我想連接到SQL

。如果沒有連接,就會建立起來,如果有連接,它將被重用並且沒有多線程問題。

有人能告訴我我可以期待從事這種工作的方式發生什麼問題嗎?或者,也許這是最好的辦法嗎?

+0

[這](http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392)可以解釋你爲什麼不應該使用上下文比任何單個業務單元其他工作(單線程邏輯業務操作)。 – 2012-02-01 09:34:50

回答

2

但如果我介紹的多線程,使用相同的背景下試圖從各地針對不同對象的地方獲得多個值 (負載對象的GUI, 的ListView等)?難道它不會對我造成嚴重傷害 ?

是的,是的,它會。上下文基本上是數據庫連接上的一個薄層 - 這不是線程安全的,所以不能在線程之間重複使用相同的上下文。你在尋找的是一個工作單位,你可以在這個工作單位中使用相同的上下文,但是一旦你的工作單元完成了,你就可以處理上下文。由於您使用自己的存儲庫實現,因此您必須在這些存儲庫之上構建工作單元。