Entity Framework: DbContext и настройка ProviderName
Когда вы выходите из DbContext и используете конструктор без параметров, он загружает строку соединения из web.config. У вас также есть возможность явно указать connectionString с использованием одного из других конструкторов DbContext.
В моей конкретной ситуации указано, что строка подключения НЕ МОЖЕТ быть указана в файле web.config, так как местоположение сервера/имя пользователя и пароль определяются во время выполнения. Легко исправить? Просто используйте вышеупомянутый конструктор, чтобы указать строку подключения? Неправильно.
Проблема заключается в том, что когда вы указываете строку соединения с использованием указанного конструктора, она по-прежнему пытается использовать поставщика по умолчанию, поэтому, если вы используете один или несколько нестандартных поставщиков, как я, это не сработает.
Я уверен, что могу изменить поставщика по умолчанию в файле web.config, но я хочу использовать несколько поставщиков, чтобы этого не было.
Единственным возможным способом, который я вижу, является использование ObjectContext вместо DbContext, который, как представляется, позволяет указать поставщика вместе со строкой подключения к базе данных.
Есть ли другой способ сделать это? Мое обходное решение довольно разумно?
Я считаю, что я также могу создать DbContext из экземпляра ObjectContext.
Ответы
Ответ 1
Создайте свой DbConnection
вручную и передайте его конструктору DbContext
следующим образом:
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
Обратите внимание, что второй параметр bool contextOwnsConnection
равен true
. Поскольку вы не используете повторное использование соединения в другом месте, он позволяет контексту управлять соединением и Dispose()
при необходимости.
Ответ 2
Вы можете перейти к ObjectContext через IObjectContextAdapter:
((IObjectContextAdapter)context).ObjectContext
DbContext ( "контекст" выше) все еще обертывает ObjectContext, поэтому не беспокойтесь, что у вас будет новый экземпляр.
Вы можете создать экземпляр DbContext, используя эту перегрузку
public DbContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) {}
например:
public class YourDbContext : DbContext
{
public YourDbContext() : this(new YourObjectEntities(), dbContextOwnsObjectContext: true)
{}
}
Затем вы можете установить строку своего соединения внутри объектов YourObjectEntities:
public partial class YourObjectEntities : ObjectContext
{
public const string ConnectionString = "name=YourEntities"; // Get it from somewhere
public YourObjectEntities() : base(ConnectionString, "YourEntities")
{
// Some initialization, e.g. ContextOptions.LazyLoadingEnabled = false;
}
}
Как вы указываете провайдера, есть ваше упражнение.
Ответ 3
Попробуйте это,
public DBDataContext _dataContex;
public DBDataContext DBContext
{
get
{
if (_dataContex== null)
{
_v= new DBDataContext(ConfigurationManager.ConnectionStrings["yourConnectinString"].ConnectionString);
}
return _dataContex;
}
}