2014-01-14 65 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生成的模型,我不确定幕后是如何处理的,这是我强调的问题。我假设他们是一个连接池,将它们全部作为一个整体处理,我只想确认这一点。 –