实体框架代码首先与SQL Server同义词



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

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

  • 一个SQL Server数据库的所有用户的列表,连同所有用户/公司通用的

  • N公司特定数据库的数量,每个数据库具有相同的模式,但每个公司的数据不同。登录时,我将动态地为特定用户的公司选择数据库

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

我已经发现了SQL Server同义词,看起来他们可以做这项工作,似乎我可以成功地通过使用SQL Server管理工作室的查询连接两个数据库之间。

是否有可能首先在实体框架代码中使用同义词表,如果是这样,我的POCO类/DbContext需要看起来像什么?

谢谢:)

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

我给你两种情况:

  1. 多对多:在这种情况下,有关系的表在sharedDB中,但是连接它们的第三个表在公司特定的DB中。
  2. 单对多:哪一个表在SharedDB中,另一个表在公司专用数据库中。
<标题>多对多

1。在SQL端创建同义词

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

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

让我们假设您的共享表有两列(不关心)命名为studentIDcourseID

2。创建poco

假设我们在本地数据库上有两个表,它们之间有多对多关系。让我们假设第三个join表(包含键)位于共享DB中!!(我认为这是最糟糕的方式)。所以你的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是一个同义词。然后创建关系:)

最新更新