sql >> Base de Datos >  >> RDS >> Sqlserver

Entity Framework Code First con sinónimos de SQL Server

Si entendí bien, tiene un servidor compartido y algunos servidores locales (específico de la empresa) que quieren tener todos los objetos de ambos (uno compartido, uno específico de la empresa) en un solo contexto.

Te daré dos escenarios:

  1. Muchos a Muchos :en este caso, la tabla para tener relación está en sharedDB , pero la tercera tabla que se une a ellas está en la base de datos específica de la empresa .
  2. De uno a muchos :cuál de las tablas está en SharedDB y el otro en la base de datos específica de la empresa .

Muchos a Muchos

1. Cree su sinónimo en el lado SQL

Primero debe crear el sinónimo en su base de datos local (o específica de la empresa):

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

supongamos que su tabla compartida tiene dos columnas (no importa) llamadas studentID y courseID .

2. Crea los POCO

Supongamos que tenemos dos tablas en la base de datos local que tienen una relación de muchos a muchos entre sí. ¡y supongamos que la tercera tabla de unión (que contiene las claves) se encuentra en la base de datos compartida! (Creo que es la peor manera). por lo que sus POCO se verán así:

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

y

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

y el Compartido uno:

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

y el contexto parece:

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

el código en OnModelCreating le dice al generador de modelos que la tabla de relaciones es un sinónimo (no directamente). y sabemos que el sinónimo está en SharedDB .

Uno a muchos

¡Sin pasos! Simplemente modifique el OnModelCreating a:

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

y tenga en cuenta que en este caso Students es un sinónimo . luego crea la relación :)