2013-08-04 46 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請求使用一個新的連接字符串陷入困境? –

相關問題