Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Prima il codice di Entity Framework con i sinonimi di SQL Server

Se ho capito bene, hai un Server condiviso e alcuni LocalServer (company specific) che vogliono avere tutti gli oggetti di entrambi (uno condiviso, uno specifico dell'azienda) in un unico contesto.

Ti propongo due scenari:

  1. Molti a molti :in questo caso, le tabelle da avere in relazione sono in sharedDB , ma la terza tabella che li unisce si trova nel DB specifico dell'azienda .
  2. Da singolo a molti :quale delle tabelle si trova in SharedDB e l'altro nel DB specifico dell'azienda .

Molti a molti

1. Crea il tuo sinonimo in lato SQL

Per prima cosa devi creare il sinonimo nel tuo DB locale (o specifico dell'azienda):

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

supponiamo che la tua tabella condivisa abbia due colonne (non importa) denominate studentID e courseID .

2. Crea i POCO

Supponiamo di avere due tabelle su DB locale che hanno una relazione Molti-a-Molti tra loro. e supponiamo che la terza tabella di joiner (che contiene le chiavi) si trovi in ​​un DB condiviso!! (Penso che sia il modo peggiore). quindi i tuoi POCO avranno questo aspetto:

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

e

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

e il Condiviso uno:

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

e il contesto assomiglia a:

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

il codice in OnModelCreating dice al costruttore del modello che la tabella delle relazioni è un sinonimo (non direttamente). e sappiamo che il sinonimo è in SharedDB .

Uno a molti

Nessun passaggio! Basta modificare il OnModelCreating a:

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

e nota che in questo caso Students è un sinonimo . quindi crea la relazione :)