gpt4 book ai didi

sql-server - Entity Framework 代码优先与 SQL Server 同义词

转载 作者:行者123 更新时间:2023-12-03 14:40:30 24 4
gpt4 key购买 nike

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

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

  • 一个用于所有用户列表的 SQL Server 数据库,以及
    任何 的表所有用户/公司通用
  • N 个公司特定数据库 ,每个公司的架构相同,但数据不同。登录时,我会为特定用户的公司动态选择数据库

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

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

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

    谢谢 :)

    最佳答案

    如果我理解正确,你有一个 共享服务器 和一些 本地服务器 (特定于公司的)希望在单个上下文中拥有两者的所有对象(一个是共享的,一个是公司特定的)。
    我给你两个场景:

  • 多对多 :在这种情况下,有关系的表在 共享数据库 ,但加入它们的第三个表位于 公司特定数据库 .
  • 单对多 :表中的哪一张 SharedDB 另一个在 公司特定数据库 .

  • 多对多
    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同义词 .然后建立关系:)

    关于sql-server - Entity Framework 代码优先与 SQL Server 同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443463/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com