2015-11-28 2 views
1

Мне любопытно узнать, как это работает. Если мой класс А создать контекст данных сEntity Framework с множественным созданием

dbContext = new S_ERP_DBEntities(); 

потом, мой класс А вызывает метод в классе B, который также нуждается в контексте данных, так что я снова сделать

dbContext = new S_ERP_DBEntities(); 

ли ее открытой кратными соединения с БД или только один?

ответ

0

Использование new в любом месте создаст новые экземпляры каждый раз, когда будет использоваться.

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

Надеюсь, что это очищает основную идею.

+0

Как насчет огромного приложения, такого как система ERP? следует ли использовать один экземпляр или новый экземпляр в каждом классе? –

+1

Всё зависит от меня. Если ваш объект сильно инициализируется, то один экземпляр может оказаться лучше. Если ваше приложение размещено в Интернете, и вы используете сеансы или какую-то обработку сеанса пользователя, то менее рискованно создавать несколько экземпляров для каждого пользователя. Вам нужно будет прочитать некоторые статьи, чтобы найти то, что подходит вам лучше всего для вашего требования. –

+0

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

0

Открывает ли он множественные соединения с БД или только один?

Зависит от того, как вы его используете, и это зависит от вашего определения открытых множественных соединений. Это не простой и простой вопрос.

Один из немногих способов вы открывать несколько соединений одновременно (наиболее распространенные в новом коде), если вы используете некоторые команды асинхронных как:

using (var dbContext1 = new S_ERP_DBEntities()) 
using (var dbContext2 = new S_ERP_DBEntities()) 
{ 
    var cars = await dbcontext1.Cars.ToListAsync(); 
    var cars = await dbcontext2.Cars.ToListAsync(); 
} 

В этом примере есть только хороший шанс что откроются два соединения, и тогда оба будут закрыты. В противном случае большинство кода запускается синхронно, и поэтому каждый запрос EF для выполнения sql будет открываться и закрываться до того, как будет выполнена следующая строка кода.

Это сложнее, потому что пул приложений имеет один или несколько connection pools. Если строки соединения одинаковы, то одно и то же соединение можно использовать в моих контекстах (даже в разных запросах или в разных контекстах).