一些背景知识:我们销售在线产品,每个客户都有自己的数据库,但使用的是共享服务。
我想使用 EF6 而不是旧的 ADO.NET,但据我所知,在创建 dbcontext 时无法更改数据库,而且我担心为每个查询创建一个新的 dbcontext 成本太高。
并且缓存 1000+ dbcontext 听起来是一个非常糟糕的解决方案。
一些背景知识:我们销售在线产品,每个客户都有自己的数据库,但使用的是共享服务。
我想使用 EF6 而不是旧的 ADO.NET,但据我所知,在创建 dbcontext 时无法更改数据库,而且我担心为每个查询创建一个新的 dbcontext 成本太高。
并且缓存 1000+ dbcontext 听起来是一个非常糟糕的解决方案。
连接池不适用于 1000 多个连接字符串。每个数据库将有一个池,从而导致大量连接。
我建议您先连接到一个虚拟数据库,然后使用DbConnection.ChangeDatabase
更改为正确的数据库。EF 没有注意到这一点并且工作得很好。
你不需要缓存DbContext
's. 它们很轻。
这实际上很容易做到
public class MyContext : DbContext{
public MyContext(string connectionStringName): base(connectionStringName){}
}
或者
public class MyContext : DbContext{
public MyContext(DbConnection connection): base(connection, contextOwnsConnection: true){}
}
您可以执行以下操作:
public class BaseContext<TContext> : DbContext where TContext : DbContext
{
protected BaseContext(): base("name=DbName")
{
}
}
并且像这样使用它:
public class StatusContext : BaseContext<StatusContext>
{
....
}
从 BaseContext 继承的所有上下文都将使用相同的数据库。
您不必太在意构建 DbContext 的成本。在决定 DbContext/ObjectContext 的生命周期时还需要考虑其他因素,您可以在此处找到。
共享您的 DbContext 实例并不是一个好主意,主要是因为上面链接中提到的内存使用和线程安全。