实体框架:DbContext并设置ProviderName

时间:2013-07-01 08:19:00

标签: entity-framework

当您从DbContext派生并使用无参数构造函数时,它将从web.config加载连接字符串。您还可以选择使用其他DbContext构造函数之一显式指定connectionString。

我的特殊情况表明不能在web.config中指定连接字符串,因为服务器/用户名和密码的位置是在运行时确定的。轻松修复吧?只需使用上面提到的构造函数来指定连接字符串?错。

问题在于,当您使用所述构造函数指定连接字符串时,它仍会尝试使用默认提供程序,因此如果您使用一个或多个非标准提供程序,那么它将不起作用。

我确信我可以在web.config中更改默认提供程序,但我想使用多个提供程序,所以这样做不会。

我能看到的唯一可能的方法是使用ObjectContext而不是DbContext,它似乎允许您指定提供程序以及数据库连接字符串。

还有其他办法吗?我的解决方法是否合理?

我相信我也可以从ObjectContext实例创建一个DbContext。

3 个答案:

答案 0 :(得分:33)

手动创建DbConnection并将其传递给DbContext构造函数,如下所示:

var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";

new DbContext(conn, true);

注意第二个参数bool contextOwnsConnectiontrue。由于您不在其他地方重新使用该连接,因此它允许上下文管理连接,并在需要时Dispose()

答案 1 :(得分:0)

您可以通过IObjectContextAdapter获取ObjectContext:

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

如何指定提供者进行锻炼。

答案 2 :(得分:-3)

试试这个,

public DBDataContext _dataContex;

public DBDataContext DBContext 
    {
        get
        {
            if (_dataContex== null)
            {
                _v= new DBDataContext(ConfigurationManager.ConnectionStrings["yourConnectinString"].ConnectionString);
            }
            return _dataContex;
        }

    }