Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Código do Entity Framework primeiro com sinônimos do SQL Server


Se entendi bem, você tem um SharedServer e alguns LocalServers (específico da empresa) que desejam ter todos os objetos de ambos (um compartilhado, outro específico da empresa) em um único contexto.

Vou te dar dois cenários:
  1. Muitos para muitos :neste caso, a tabela a ter relação está em sharedDB , mas a terceira tabela que os une está no DB específico da empresa .
  2. De um para muitos :qual das tabelas está em SharedDB e o outro no DB específico da empresa .

Muitos para muitos

1. Crie seu sinônimo no lado do SQL


Primeiro você precisa criar o sinônimo em seu banco de dados local (ou específico da empresa):
CREATE SYNONYM [dbo].[StudentCources] FOR [SharedServer].[SharedDB].[dbo].[StudentCources]

vamos supor que sua tabela compartilhada tenha duas colunas (não importa) chamadas studentID e courseID .

2. Crie os POCOs


Vamos supor que temos duas tabelas no banco de dados local que possuem relacionamento muitos para muitos entre si. e vamos supor que a terceira tabela do joiner (que contém as chaves) esteja localizada no banco de dados compartilhado!! (eu acho que é a pior maneira). então seus POCOs ficarão assim:
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 o Compartilhado 1:
Public Class StudentCources
    Public Property courseID as Integer
    Public Property studentID as Integer
End Class

e o contexto fica assim:
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

o código no OnModelCreating informa ao construtor de modelo que a tabela de relações é um sinônimo (não diretamente). e sabemos que o sinônimo está em SharedDB .

Um para muitos


Sem passos! Basta modificar o OnModelCreating para:
modelBuilder.Entity(Of Student).ToTable("Students", "dbo")

e observe que neste caso Students é um Sinônimo . então crie a relação :)