2014-01-14 69 views
1

當使用實體框架時,如果我們創建單個實體的五個單獨對象,.NET是否爲每個實體單獨建立一個數據庫連接或知道它是否知道因爲它是相同的實體容器,所以足以將其彙集到幕後的單個連接中。在實體框架中創建實體容器的多個實例是否創建多個連接

在下面的例子中,將這個創建五個單獨的連接,或者只是一個,因爲他們都是dbEntity的一個實例,因此使用相同的基本實體容器

'Do 5 row counts on a new instance of dbEntity each time 
For I as integer = 1 to 5 
    Dim ent as new dbEntity 
    Dim count = ent.Table.Count() 
Next 

的原因,我問的是現在我正在創建一個dbEntity的實例,但從不同的表中選擇了幾十行。問題是,如果我想更新從表中選擇的行作爲本地可用,但不將它保存到數據庫,我不能執行ent.SaveChanges或所有更改都會保存。下面

例子:

Dim ent as new dbEnt 'Connect to the DB 
Dim localOnly = ent.Table.First; 'Get the first row (we never want to save changes right now) 
localOnly.Name = "John" 'I do not want to ever save this 

'Update our settings 
Dim settings = ent.Settings.First 'Get our settings row 
settings.updated = NOW() 'Tell them we updated our settings now 
ent.SaveChanges() ‘Since this is all one instance of dbEnt, localOnly gets saved even if we didn’t want it to 

現在的解決辦法是隻創建dbEnt的兩個實例。第一個是readOnly,我從來沒有運行過SaveChanges。第二個是我想保存更改的特定行。我的問題是,我在數十張表上執行此操作,因此如果每次創建一個dbEnt實例時都會建立一個新的連接到服務器,那麼我不想創建數十個連接。

回答

1

不,它不會創建到數據庫的多個連接,它會在您處理對象DBContext時關閉連接。但我建議您不要使用單個DBContext,而是在您的數據訪問層中的每種方法中創建並配置DBContext。例如:

public Function GetUsers() As IList(of UserDTO) 
    Using DBContext As new SomeDataContext() 
     return DBContext.TblUsers.Select(Function(u) new UserDTO(u.UserId, u.Username)).ToList() 
    End Using 
End Function 

不要暴露DBContext或其任何實體的該DAL,使用數據傳輸對象之外。 (UserDTO類在這種情況下)

+0

很抱歉,如果我沒有提到它,但我使用的是ADO.net實體數據模型,所以當我說一個DBContext時,我的意思是我的模型的實體容器。我說DBContext自從我檢查它時就繼承了那個類。 這就是說,我正在更新我的問題來配合。所以如果我製作了多個實體容器的實例,它不會多次連接? –

+0

每個數據上下文有一個連接,如果你有一個連接,那就有一個連接。 – Magnus

+0

我不知道如果通過執行上面發佈的代碼,那是一個或五個,那就是問題所在。如果我創建了15個我的實體容器的副本,例如dim currentEnt = new dbEnt()是15個副本的上下文還是單個副本? 由於我使用的是由Visual Studio生成的模型,我不確定幕後是如何處理的,這是我強調的問題。我假設他們是一個連接池,將它們全部作爲一個整體處理,我只想確認這一點。 –