一些背景:我們銷售在線產品,每個客戶都有自己的數據庫,但正在使用共享服務。我需要每個數據庫的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,則可以重新使用連接。你可能需要火星人也這樣做 –