sql-server – 实体框架代码首先使用SQL Server同义词

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

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

>一个sql Server数据库,包含所有用户的列表
所有用户/公司共有的任何表格
> N个公司特定数据库,每个数据库具有相同的架构,但每个公司的数据不同.登录时,我会动态选择特定用户公司的数据库

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

我发现了sql Server同义词,看起来他们可以完成这项工作,似乎我可以通过在sql Server Management Studio中使用查询成功地在两个数据库之间加入.

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

谢谢 :)

解决方法

请关注我可怕的英语!

我有同样的问题并解决了它.在找到解决方案之前一直很难,但如果我写出解决方案,你会笑的!因为它太简单了

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

我会给你两个场景:

>多对多:在这种情况下,具有关系的表位于sharedDB中,但加入它们的第三个表位于公司特定的DB中.
> Single-to-Many:哪一个表在SharedDB中,另一个在公司特定的DB中.

许多一对多

1.在sql端创建同义词

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

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

假设您的共享表有两列(无关)名为studentID和courseID.

2.创建POCO

假设我们在本地DB上有两个表,它们之间具有多对多关系.让我们假设第三个连接表(包含键)位于共享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")

并注意在这种情况下,学生是同义词.然后创建关系:)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...