32

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

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

问题是,当您使用所述构造函数指定连接字符串时,它仍会尝试使用默认提供程序,因此,如果您像我一样使用一个或多个非标准提供程序,它将无法工作。

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

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

还有其他方法吗?我的解决方法相当合理吗?

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

4

3 回答 3

37

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

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

new DbContext(conn, true);

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

于 2013-07-01T11:31:42.923 回答
0

您可以通过 IObjectContextAdapter 访问 ObjectContext:

((IObjectContextAdapter)context).ObjectContext

DbContext(上面的“context”)仍然包装了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;
    }
}

你如何指定提供者有你的练习。

于 2013-07-01T09:51:35.980 回答
-2

像这样试试

public DBDataContext _dataContex;

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

    }
于 2013-07-01T11:48:56.863 回答