如果我理解正确,您有一个SharedServer和一些LocalServers(特定于公司),它们希望将两者的所有对象(一个共享,一个特定于公司)放在一个上下文中。
我给你两个场景:
- 多对多:在这种情况下,有关系的表在sharedDB中,但加入它们的第三个表在公司特定的 DB中。
- Single-to-Many:其中一张表在SharedDB中,另一张在公司特定 DB中。
多对多
1. 在 SQL 端创建你的同义词
首先,您必须在本地(或公司特定)数据库中创建同义词:
CREATE SYNONYM [dbo].[StudentCources] FOR [SharedServer].[SharedDB].[dbo].[StudentCources]
假设您的共享表有两列(无关紧要),名为studentID
和courseID
。
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。然后创建关系:)