实体框架 - 连接字符串 - 最佳实践

时间:2014-02-28 13:48:18

标签: .net vb.net entity-framework

我使用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=&quot;localhost&quot;;initial catalog=&quot;UIVB Tests&quot;;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=&quot;rmsi.net&quot;;initial catalog=&quot;UIVB Tests&quot;;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! 我需要修改自动生成的类

有没有正确的方法?什么是最佳做法?

3 个答案:

答案 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=&quot;UIVB Tests&quot;;user id=sa;password=***" _
             }.ConnectionString

第三,我使用自己的构造函数和我自己的连接字符串; - )

 Dim viticulteurContext As ViticulteurEntities
 .
 .
 .
 viticulteurContext = New ViticulteurEntities(viticulteurConnectionString)
来源:

全部谢谢!