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;
        }

    }