Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Entity Framework Code First avec les synonymes SQL Server

Si j'ai bien compris, vous avez un SharedServer et quelques LocalServers (spécifique à l'entreprise) qui souhaitent avoir tous les objets des deux (l'un partagé, l'autre spécifique à l'entreprise) dans un seul contexte.

Je vais vous proposer deux scénarios :

  1. Plusieurs à plusieurs  :dans ce cas, la table pour avoir la relation est dans sharedDB , mais la troisième table qui les rejoint se trouve dans la base de données spécifique à l'entreprise .
  2. Unique à plusieurs  :laquelle des tables se trouve dans SharedDB et l'autre dans la base de données spécifique à l'entreprise .

Plusieurs à plusieurs

1. Créez votre synonyme côté SQL

Vous devez d'abord créer le synonyme dans votre base de données locale (ou spécifique à l'entreprise) :

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

supposons que votre table partagée ait deux colonnes (peu importe) nommées studentID et courseID .

2. Créer les POCO

Supposons que nous ayons deux tables sur une base de données locale qui ont une relation plusieurs à plusieurs entre elles. et supposons que la troisième table de jointure (qui contient les clés) se trouve dans la base de données partagée !! (Je pense que c'est la pire façon). vos POCO ressembleront donc à ceci :

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

et

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

et le Partagé un :

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

et le contexte ressemble à :

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

le code dans le OnModelCreating indique au constructeur du modèle que la table de relations est un synonyme (pas directement). et nous savons que le synonyme est dans SharedDB .

Un à plusieurs

Pas de marches ! Modifiez simplement le OnModelCreating à :

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

et notez que dans ce cas Students est un synonyme . puis créez la relation :)