【问题标题】:Entity Framework - Connection String - Best practice实体框架 - 连接字符串 - 最佳实践
【发布时间】:2014-04-01 13:26:52
【问题描述】:

我使用 EF5 开发了一个应用程序,我想知道如何配置不同的连接字符串(例如本地和实时)。 我知道所有的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 构造函数在 2 个不同的连接之间切换:

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 !!! 我需要修改自动生成的类

有什么方法可以正确地做到这一点吗?最佳做法是什么?

【问题讨论】:

  • 通常不同的环境连接字符串是通过 web.config 转换处理的。当您为另一个环境构建/部署时,它会自动为您转换配置。您需要在开发过程中访问所有环境吗?
  • 这是一个独立的应用程序,不是网络应用程序 ;-)
  • @Cooxkie 使用 post/pre-build 事件的 app.config 有类似的概念

标签: .net vb.net entity-framework


【解决方案1】:

查看Config Transform Nuget 包,它将允许您在非 Web 项目上执行 Web.Config 之类的转换。

在另一个 Stack Overflow 问题here 中有一个使用这个包的演练。

【讨论】:

  • 感谢您的帮助,即使这不是我想要的,您在我的研究中帮助我;-)!
【解决方案2】:

我不知道这是否可以直接帮助你,但我之前不得不为不同的实体处理不同的连接字符串。

我所做的是在存储库中实现逻辑。

如果您希望使用不同的连接字符串初始化上下文,具体取决于已初始化存储库的实体,您可以执行以下操作:

//'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>();

}

希望这会有所帮助。

【讨论】:

  • 感谢您的帮助,即使这不是我想要的,您在我的研究中帮助我;-)!
【解决方案3】:

好的,我找到了解决方案,需要做出一些让步;-)!

首先我修改了每个实体的构造函数。我添加了带有字符串参数的新构造函数:

    '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)

来源:

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2017-09-07
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多