sql >> Database >  >> RDS >> Sqlserver

Entity Framework Code First met SQL Server-synoniemen

Als ik het goed heb begrepen, heb je een SharedServer en enkele LocalServers (bedrijfsspecifiek) die alle objecten van beide (een gedeeld, een bedrijfsspecifiek) in één context willen hebben.

Ik geef je twee scenario's:

  1. Veel-op-veel :in dit geval staat de tabel die een relatie moet hebben in sharedDB , maar de derde tabel die zich bij hen voegt, bevindt zich in bedrijfsspecifieke DB .
  2. Enkel-op-veel :welke van de tabellen bevindt zich in SharedDB en de andere in bedrijfsspecifieke DB .

Veel-op-veel

1. Maak uw synoniem aan de SQL-kant

Eerst moet u het synoniem in uw lokale (of bedrijfsspecifieke) database aanmaken:

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

laten we aannemen dat je gedeelde tabel twee kolommen heeft (maakt niet uit) met de naam studentID en courseID .

2. Maak de POCO's

Laten we aannemen dat we twee tabellen hebben op lokale DB die een Many-to-Many relatie tussen elkaar hebben. en laten we aannemen dat de derde joiner-tabel (die de sleutels bevat) zich in de gedeelde DB bevindt!! (Ik denk dat dit de slechtste manier is). dus uw POCO's zien er als volgt uit:

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

en

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

en de Gedeeld een:

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

en de context ziet er als volgt uit:

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

de code in de OnModelCreating vertelt de modelbouwer dat de relatietabel een synoniem is (niet direct). en we weten dat het synoniem staat in SharedDB .

Een-op-veel

Geen stappen! Wijzig gewoon de OnModelCreating naar:

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

en merk op dat in dit geval Students is een Synoniem . maak dan de relatie :)




  1. Alleen toetsenbordnavigatie gebruiken in Word, Excel en PowerPoint (deel 1:het lint)

  2. PostgreSQL:automatisch verhogen op basis van unieke beperking met meerdere kolommen

  3. ODBC 4.0

  4. Gebruik NEWID() om een ​​unieke waarde te creëren in SQL Server