12

我有这样的情况,我将有多家公司访问我的应用程序的一个实例,但我需要隔离他们的数据以避免意外加载另一家公司的数据,并简化每个公司的数据库备份。

理想情况下,我想将数据分成不同的数据库,如下所示:

  • 一个 SQL Server 数据库,用于列出所有用户,以及所有用户/公司通用的任何表

  • N 个公司特定数据库,每个数据库具有相同的架构,但每个公司的数据不同。登录时,我会为特定用户的公司动态选择数据库

我希望能够查询公司特定的数据表,但是对共享数据库执行连接(例如,我可以在公司数据库表中存储一个外键,它连接到共享表的主键另一个数据库)。

我发现了看起来可以完成这项工作的 SQL Server 同义词,而且似乎我可以通过使用 SQL Server Management Studio 中的查询成功地连接两个数据库。

是否可以在 Entity Framework Code First 中使用同义词表,如果可以,我的 POCO 类/DbContext 需要是什么样的?

谢谢 :)

4

1 回答 1

9

如果我理解正确,您有一个SharedServer和一些LocalServers(特定于公司),它们希望将两者的所有对象(一个共享,一个特定于公司)放在一个上下文中。

我给你两个场景:

  1. 多对多:在这种情况下,有关系的表在sharedDB中,但加入它们的第三个表在公司特定的 DB中。
  2. Single-to-Many:其中一张表在SharedDB中,另一张在公司特定 DB中。

多对多

1. 在 SQL 端创建你的同义词

首先,您必须在本地(或公司特定)数据库中创建同义词:

CREATE SYNONYM [dbo].[StudentCources] FOR [SharedServer].[SharedDB].[dbo].[StudentCources]

假设您的共享表有两列(无关紧要),名为studentIDcourseID

2. 创建 POCO

假设我们在本地数据库中有两个表,它们之间具有多对多关系。让我们假设第三个连接器表(包含键)位于共享数据库中!(我认为这是最糟糕的方式)。所以你的 POCO 看起来像这样:

Public Class Student
    Public Property studentID as Integer
    Public Property Name as String
    Public Property Courses as ICollection(Of Course)
End Class

Public Class Course
    Public Property courseID as Integer
    Public Property Name as String
    Public Property Students as ICollection(Of Student)
End Class

共享的:

Public Class StudentCources
    Public Property courseID as Integer
    Public Property studentID as Integer
End Class

和上下文看起来像:

Partial Public Class LocalContext
    Inherits DbContext

    Public Sub New()
        MyBase.New("name=LocalContext")        
    End Sub

    Public Overridable Property Students As DbSet(Of Student)
    Public Overridable Property Courses As DbSet(Of Course)

    Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
        modelBuilder.Entity(Of Student).HasMany(Function(e) e.Courses).WithMany(Function(e) e.Students).Map(Sub(e)
            e.MapLeftKey("studentID")
            e.MapRightKey("courseID")
            e.ToTable("StudentCources", "dbo")
    End Sub)

    End Sub
End Class

中的代码OnModelCreating告诉模型构建器关系表是同义词(不是直接的)。我们知道同义词在SharedDB中。

一对多

没有步骤!只需修改OnModelCreating为:

modelBuilder.Entity(Of Student).ToTable("Students", "dbo")

并注意在这种情况下Students是一个Synonym。然后创建关系:)

于 2014-07-24T06:21:11.287 回答