一些背景:我们销售在线产品,每个客户都有自己的数据库,但正在使用共享服务。我需要每个数据库的DbContext吗?
我想使用EF6而不是旧的ADO.NET,但据我所知,当创建dbcontext时无法更改数据库,并且我担心为每个创建新的dbcontext都太昂贵查询。
缓存1000 + dbcontext听起来像是一个非常糟糕的解决方案。
一些背景:我们销售在线产品,每个客户都有自己的数据库,但正在使用共享服务。我需要每个数据库的DbContext吗?
我想使用EF6而不是旧的ADO.NET,但据我所知,当创建dbcontext时无法更改数据库,并且我担心为每个创建新的dbcontext都太昂贵查询。
缓存1000 + dbcontext听起来像是一个非常糟糕的解决方案。
连接池将无法正常使用1000个连接字符串。每个数据库将有一个池,导致大量连接。
我建议您首先连接到虚拟数据库,然后使用更改为正确的数据库。 EF没有注意到这一点,并且工作得很好。
你不需要缓存DbContext
的。它们轻巧。
其实,这是很容易做到
public class MyContext : DbContext{
public MyContext(string connectionStringName): base(connectionStringName){}
}
或
public class MyContext : DbContext{
public MyContext(DbConnection connection): base(connection, contextOwnsConnection: true){}
}
你不应该太在意建设的DbContext的成本。在决定DbContext/ObjectContext的生命周期时还有其他因素需要考虑,您可以找到here。
分享你的DbContext实例不是一个好主意,主要是因为上面的链接中提到的内存使用和线程安全。
你可以做下一个:
public class BaseContext<TContext> : DbContext where TContext : DbContext
{
protected BaseContext(): base("name=DbName")
{
}
}
和使用它像这样:
public class StatusContext : BaseContext<StatusContext>
{
....
}
从BaseContext继承将使用相同的数据库中的所有上下文。
因此,如果我有100个相同的数据库,我不会为每个http请求使用一个新的连接字符串陷入困境? –
+1我使用卢克建议的多租户模式 –
在关于连接池的说明中,如果设置第二个构造函数并使用contextownsconnection为false,则可以重新使用连接。你可能需要火星人也这样做 –