我使用EF5开发应用程序,我想知道如何配置不同的connectionString(例如本地和实时)。 我知道所有connectionsString都在app.config文件中:
<connectionStrings>
<add name="MandatsEntitiesLocal" connectionString="metadata=res://*/MandatsModel.csdl|res://*/MandatsModel.ssdl|res://*/MandatsModel.msl;provider=System.Data.SqlClient;provider connection string='data source="localhost";initial catalog="UIVB Tests";user id=sa;password=***;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />
<add name="MandatsEntities" connectionString="metadata=res://*/MandatsModel.csdl|res://*/MandatsModel.ssdl|res://*/MandatsModel.msl;provider=System.Data.SqlClient;provider connection string='data source="rmsi.net";initial catalog="UIVB Tests";user id=sa;password=***;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />
</connectionStrings>
我也知道我可以使用DbContext构造函数在两个不同的连接之间切换:
Partial Public Class MandatsEntities
Inherits DbContext
Public Sub New()
MyBase.New("name=MandatsEntities")
End Sub
Public Sub New(connectionName As String)
MyBase.New(connectionName)
End Sub
End Class
但我需要修改自动生成的类(我认为不推荐)
所以,总结一下,如果我有10个上下文和2个数据库,我需要管理20个connectionString! 我需要修改自动生成的类
有没有正确的方法?什么是最佳做法?
答案 0 :(得分:0)
查看Config Transform Nuget Package,它将允许您执行Web.Config,就像在非Web项目上进行转换一样。
在另一个Stack Overflow问题here中有一个使用此软件包的步骤。
答案 1 :(得分:0)
我不知道这是否可以直接帮助你,但我不得不为不同的实体处理不同的连接字符串。
我所做的是在存储库中实现逻辑。
如果您希望使用不同的连接字符串初始化上下文,则根据已初始化存储库的实体,您可以执行以下操作:
//'Customers' and 'Orders' are in a different database than 'Products' and 'Vendors'...
private string[] _EntitiesGroup1 = { typeof(Customers).Name, typeof(Orders).Name };
private string[] _EntitiesGroup2 = { typeof(Products).Name, typeof(Vendors).Name };
在您的存储库构造函数中,您可以执行以下操作:
public Repository()
{
if (Array.Exists(_EntitiesGroup1 , x => x == typeof(T).Name))
_context = new Entities1();
if (Array.Exists(_EntitiesGroup2 , x => x == typeof(T).Name))
_context = new Entities2();
_objectSet = _context.CreateObjectSet<T>();
}
希望这有点帮助。
答案 2 :(得分:0)
好的,我找到了一个解决方案,需要做出一些让步;-)!
首先,我修改了每个实体的构造函数。我添加了带有字符串参数的新构造函数:
'constructor auto-generated
Public Sub New()
MyBase.New("name=ViticulteurEntities")
End Sub
'constructor added by me
Public Sub New(connectionName As String)
MyBase.New(connectionName)
End Sub
其次我创建了自己的连接字符串:
viticulteurConnectionString = New System.Data.EntityClient.EntityConnectionStringBuilder() _
With {
.Metadata = "res://*/MandatsModel.csdl|res://*/MandatsModel.ssdl|res://*/MandatsModel.msl", _
.Provider = "System.Data.SqlClient", _
.ProviderConnectionString = "data source=rmsi.net;;initial catalog="UIVB Tests";user id=sa;password=***" _
}.ConnectionString
第三,我使用自己的构造函数和我自己的连接字符串; - )
Dim viticulteurContext As ViticulteurEntities
.
.
.
viticulteurContext = New ViticulteurEntities(viticulteurConnectionString)
来源:
全部谢谢!