Entity Framework:DbContext和设置ProviderName

32

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

我的特殊情况要求不能在web.config中指定连接字符串,因为服务器/用户名和密码的位置是在运行时确定的。很容易解决,对吧?只需使用上述构造函数来指定连接字符串?错了。

问题在于,当您使用该构造函数指定连接字符串时,它仍然尝试使用默认提供程序,因此,如果您使用一个或多个非标准提供程序(就像我一样),它将不起作用。

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

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

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

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


1
你可以使用带有 DbConnection 参数的构造函数。 - Gert Arnold
我对此的担忧是,那样我将自己管理 DbConnection 的生命周期。我也不完全确定如何使用特定提供程序创建 DbConnection。 - NoPyGod
3个回答

37

手动创建您的DbConnection,并按以下方式将其传递给DbContext构造函数:

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

new DbContext(conn, true);

注意第二个参数 bool contextOwnsConnection 的值为 true。由于您在其他地方不会重用连接,因此让上下文管理连接并在需要时Dispose()


有没有可能只用一行代码来初始化FooDbContext,而不是上面的三行代码?因为这些代码将被重复使用:using context = new FooDbContext()... - Lei Yang

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

如何指定提供程序是您的练习。


-2

试试这样做,

public DBDataContext _dataContex;

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

    }

1
不行,我已经尝试过了。就像我说的那样,它试图使用默认提供程序。- 我再试一次以确保 - ProviderIncompatableException。 - NoPyGod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接