在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
。如果沒有連接,就會建立起來,如果有連接,它將被重用並且沒有多線程問題。
有人能告訴我我可以期待從事這種工作的方式發生什麼問題嗎?或者,也許這是最好的辦法嗎?
[這](http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392)可以解釋你爲什麼不應該使用上下文比任何單個業務單元其他工作(單線程邏輯業務操作)。 – 2012-02-01 09:34:50