Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entity Framework Code First mit SQL Server-Synonymen

Wenn ich das richtig verstanden habe, hast du einen SharedServer und einige LocalServers (unternehmensspezifisch), die alle Objekte beider (eines gemeinsam genutzten, eines unternehmensspezifischen) in einem einzigen Kontext haben möchten.

Ich gebe Ihnen zwei Szenarien:

  1. Many-to-Many :In diesem Fall befindet sich die Tabelle, die eine Beziehung haben soll, in sharedDB , aber die dritte Tabelle, die sich ihnen anschließt, befindet sich in der firmenspezifischen DB .
  2. Single-to-Many :welche der Tabellen sind in SharedDB und die andere in der firmenspezifischen DB .

Many-to-Many

1. Erstellen Sie Ihr Synonym auf der SQL-Seite

Zuerst müssen Sie das Synonym in Ihrer lokalen (oder firmenspezifischen) DB anlegen:

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

Nehmen wir an, Ihre gemeinsam genutzte Tabelle hat zwei Spalten (egal) mit dem Namen studentID und courseID .

2. Erstellen Sie die POCOs

Nehmen wir an, wir haben zwei Tabellen in der lokalen Datenbank, die eine Viele-zu-Viele-Beziehung zueinander haben. und nehmen wir an, die dritte Joiner-Tabelle (die die Schlüssel enthält) befindet sich in der gemeinsam genutzten DB !! (Ich denke, es ist der schlechteste Weg). Ihre POCOs sehen also so aus:

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

und

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

und die Geteilt eins:

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

und der Kontext sieht so aus:

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

den Code im OnModelCreating teilt dem Modellbauer mit, dass die Beziehungstabelle ein Synonym ist (nicht direkt). und wir wissen, dass sich das Synonym in SharedDB befindet .

Eins-zu-Viele

Keine Schritte! Ändern Sie einfach den OnModelCreating zu:

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

und beachten Sie, dass in diesem Fall Students ist ein Synonym . dann erstellen Sie die Beziehung :)