2014-01-14 1 views
1

При использовании структуры сущностей, если мы создаем пять отдельных объектов одного объекта, .NET делает отдельное подключение к базе данных для каждого или знает это достаточно, чтобы объединить это в одно единственное соединение за кулисами, поскольку это тот же контейнер Entity.Создает ли несколько экземпляров контейнера Entity в Entity Framework несколько соединений

В приведенном ниже примере, будет это создать пять отдельное соединение, или только один, так как они оба экземпляра dbEntity, таким образом, используя ту же самую базу Entity Container

'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 Entity Data Model, поэтому, когда я сказал DBC-текст, я действительно имел в виду контейнер сущности моей модели. Я сказал DBContext, так как, когда я его проверял, он наследовал этот класс. Это, как говорится, я обновляю свой вопрос, чтобы соответствовать этому. Итак, если я делаю несколько экземпляров контейнера этого объекта, он не подключается несколько раз? –

+0

Одно соединение для контекста данных, если у вас есть одно, чем одно соединение. – Magnus

+0

Я не уверен, выполнив код, который я написал выше, то есть один или пять, это проблема. Если я создам 15 экземпляров моего контейнера Entity, например dim currentEnt = new dbEnt(), это 15 копий контекста или одной копии? Поскольку я использую модель, сгенерированную Visual Studio, я не уверен за кулисами, как это обрабатывается, что является моей подчеркивающей проблемой. Я бы предположил, что это пул соединений где-то, который обрабатывает их всех как один, я просто хочу подтвердить это. –

Смежные вопросы