1

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

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

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

  1. 进入web.config,删除活动数据库的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. 在我们的生产服务器或我们的测试服务器上安装设置

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

4

2 回答 2

3

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

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

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

于 2010-11-09T03:55:07.420 回答
0

这是部分解决方案...您可以覆盖 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-11-08T23:13:02.120 回答