当您从DbContext派生并使用无参数构造函数时,它将从web.config加载连接字符串。您还可以选择使用其他DbContext构造函数之一显式指定connectionString。
我的特殊情况表明不能在web.config中指定连接字符串,因为服务器/用户名和密码的位置是在运行时确定的。轻松修复吧?只需使用上面提到的构造函数来指定连接字符串?错。
问题在于,当您使用所述构造函数指定连接字符串时,它仍会尝试使用默认提供程序,因此如果您使用一个或多个非标准提供程序,那么它将不起作用。
我确信我可以在web.config中更改默认提供程序,但我想使用多个提供程序,所以这样做不会。
我能看到的唯一可能的方法是使用ObjectContext而不是DbContext,它似乎允许您指定提供程序以及数据库连接字符串。
还有其他办法吗?我的解决方法是否合理?
我相信我也可以从ObjectContext实例创建一个DbContext。
答案 0 :(得分:33)
手动创建DbConnection
并将其传递给DbContext
构造函数,如下所示:
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
注意第二个参数bool contextOwnsConnection
是true
。由于您不在其他地方重新使用该连接,因此它允许上下文管理连接,并在需要时Dispose()
。
答案 1 :(得分:0)
您可以通过IObjectContextAdapter获取ObjectContext:
((IObjectContextAdapter)context).ObjectContext
DbContext(上面的“上下文”)仍然包装了ObjectContext,所以不要担心你会有一个新实例。
您可以使用此重载
实例化DbContextpublic 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;
}
}