【问题标题】:Entity Framework & ASP.NET MVC 2 : Choosing a database instance on-the-fly实体框架和 ASP.NET MVC 2:动态选择数据库实例
【发布时间】:2010-11-08 22:48:58
【问题描述】:

我目前正在开发一个 ASP.NET MVC 2 项目,该项目需要同一个 SQL Server 2008 R2 数据库的多个实例(一个在生产中使用 SQL 复制,另一个是它的开发对应物,允许模式更新和测试我们的在生产发布之前本地应用程序,一个实例启用了 SQL 复制,另一个没有它)。

目前,我们需要同一个数据库的三个实例来完成我们的工作,而不会妨碍生产活动。

我不知道这是否是好方法,但我更改数据库实例的方式如下:

  1. 进入 web.config,删除活动 DB 的 connectionString
  2. 删除当前 Database.edmx
  3. 创建一个新的 EDMX 以指向另一个数据库
  4. 用 XML 编辑器打开新的 Database.edmx 并替换它:
    <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
    有了这个 : <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Computed"/>
  5. 构建部署项目
  6. 在我们的生产服务器或测试服务器上安装设置

有没有什么方法可以更快更方便地做到这一点?在项目中,还是在部署解决方案中?

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework multiple-instances edmx


    【解决方案1】:

    是的,有一个更好的解决方案,那就是使用 EntityConnectionStringBuilder

    您可以完全控制连接的所有方面,包括提供程序、服务器/数据库、CSDL/SSDL/MSL、安全等。

    然后您可以动态分配所需的切换信息。

    【讨论】:

    • 我会试一试,让你知道我的结果,感谢 RPM1984 的提示!
    • 我错过了设置这个的时间,目前我使用了三个 .edmx 并替换了连接字符串和 DatabaseEntities(很好的 'ol Ctrl+H),这可以解决问题此时此刻。当我有时间这样做时,我会发回我的完整解决方案,以供将来参考。谢谢。 :)
    • @LoganWolfer - 很好,有时时间限制是个问题。这就是为什么在开始一个新项目时获得良好实践/基础(如依赖注入)非常重要的原因。话虽如此,没有多少项目会为一个解决方案提供 3 个不同数据库的场景。 :)
    【解决方案2】:

    这是部分解决方案...您可以在 OnContextCreated 方法中覆盖连接字符串。所以,你可以这样做:

    Private Sub OnContextCreated()
                Dim fi As FieldInfo = GetType(ObjectContext).GetField("_connection", BindingFlags.Instance Or BindingFlags.NonPublic)
                Dim Environment As String = "" 'pull from web.config
    
                'Change the connection string based on which environment you are looking at
                If Environment = "dev" Then
                    fi.SetValue(Me, New EntityConnection("dev connection string"))
                ElseIf Environment = "prod" Then
                    fi.SetValue(Me, New EntityConnection("prod connection string"))
                End If
    
            End Sub
    

    这样您就不必每次都删除并重新创建 .edmx 文件,因为连接字符串将指向正确的数据库 - 您唯一需要编辑的是 rowguid 值,因为它是不同的两个数据库之间。

    要考虑的另一件事...您可以将实体框架创建/更新/删除映射到自定义存储过程。因此,如果服务器之间只有一两列不同,则可以在任一服务器上使用自定义存储过程来处理它们之间的列差异。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2013-07-30
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多