2013-08-04 47 views
1

一些背景:我们销售在线产品,每个客户都有自己的数据库,但正在使用共享服务。我需要每个数据库的DbContext吗?

我想使用EF6而不是旧的ADO.NET,但据我所知,当创建dbcontext时无法更改数据库,并且我担心为每个创建新的dbcontext都太昂贵查询。

缓存1000 + dbcontext听起来像是一个非常糟糕的解决方案。

回答

1

连接池将无法正常使用1000个连接字符串。每个数据库将有一个池,导致大量连接。

我建议您首先连接到虚拟数据库,然后使用​​更改为正确的数据库。 EF没有注意到这一点,并且工作得很好。

你不需要缓存DbContext的。它们轻巧。

1

其实,这是很容易做到

public class MyContext : DbContext{ 
    public MyContext(string connectionStringName): base(connectionStringName){} 
} 

public class MyContext : DbContext{ 
    public MyContext(DbConnection connection): base(connection, contextOwnsConnection: true){} 
} 
+0

+1我使用卢克建议的多租户模式 –

+0

在关于连接池的说明中,如果设置第二个构造函数并使用contextownsconnection为false,则可以重新使用连接。你可能需要火星人也这样做 –

0

你不应该太在意建设的DbContext的成本。在决定DbContext/ObjectContext的生命周期时还有其他因素需要考虑,您可以找到here

分享你的DbContext实例不是一个好主意,主要是因为上面的链接中提到的内存使用和线程安全。

0

你可以做下一个:

public class BaseContext<TContext> : DbContext where TContext : DbContext 
{ 
    protected BaseContext(): base("name=DbName") 
    { 
    } 
} 

和使用它像这样:

public class StatusContext : BaseContext<StatusContext> 
    { 
     .... 
    } 

从BaseContext继承将使用相同的数据库中的所有上下文。

+0

因此,如果我有100个相同的数据库,我不会为每个http请求使用一个新的连接字符串陷入困境? –

相关问题