Платформа сущностей 6, свободное сопоставление отношений от 1 до 0..1 в столбцах без первичного ключа - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь перенести систему objectcontext / edmx в dbcontext (EF6) с помощью быстрого сопоставления.У меня есть несколько примеров, подобных следующему.Основная таблица имеет отношение к зависимой таблице, где столбец без PK в зависимой таблице содержит значение столбца PK в основной записи.Само по себе это будет отношение один ко многим, но для столбцов FK зависимой таблицы существует уникальный индекс.При использовании сопоставления EDMX это работает нормально, если вы определяете связь, используя сопоставление, а не ссылочные ограничения.Ниже приведен исполняемый пример - вам не нужна база данных, потому что она не зашла так далеко, в настоящее время:

Imports System.Data.Entity
Imports System.Data.Entity.ModelConfiguration
Module Module1

  Sub Main()
    Using session As New SaturnEntities
      Dim res = session.BookingLegSet.Select(Function(x) New With {x.Prefix, x.ID, x.AddressDetails.Address}).ToList
    End Using
  End Sub



End Module

Partial Public Class BookingLeg
  Public Property Prefix As String
  Public Property ID As Integer
  Public Property LegIndex As Integer
  Public Overridable Property AddressDetails As BookingLegAddress
End Class

Partial Public Class BookingLegAddress
  Public Property Prefix As String
  Public Property ID As Integer
  Public Property Address As String
  Public Overridable Property BookingLeg As BookingLeg
  Property JobLegPrefix As String
  Property JobLegID As Integer?


End Class

Public Class BookingLegConfig
  Inherits EntityTypeConfiguration(Of BookingLeg)

  Public Sub New()
    ToTable("JobLegs", "dbo")
    HasKey(Function(x) New With {x.Prefix, x.ID})
    HasOptional(Function(x) x.AddressDetails).WithRequired(Function(x) x.BookingLeg).Map(Function(x) x.MapKey("Prefix", "ID"))
  End Sub
End Class

Public Class BookingLegAddressConfig
  Inherits EntityTypeConfiguration(Of BookingLegAddress)

  Public Sub New()
    ToTable("JobAddresses", "dbo")
    HasKey(Function(x) New With {x.Prefix, x.ID})
    HasRequired(Function(x) x.BookingLeg).WithOptional(Function(x) x.AddressDetails).Map(Function(x) x.MapKey("JobLegPrefix", "JobLegID"))
  End Sub
End Class

Partial Public Class SaturnEntities
  Inherits DbContext


  Public Sub New()
    MyBase.New("data source=dbSaturn;initial catalog=Saturn;integrated security=True;MultipleActiveResultSets=True;")
  End Sub

  Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    modelBuilder.Configurations.Add(New BookingLegConfig)
    modelBuilder.Configurations.Add(New BookingLegAddressConfig)
  End Sub

  Public Overridable Property BookingLegAddressSet() As DbSet(Of BookingLegAddress)
  Public Overridable Property BookingLegSet() As DbSet(Of BookingLeg)
End Class

BookingLeg является основным объектом, а BookingLegAddress является зависимым.JobLegPrefix и JobLegID в зависимом элементе будут иметь нулевое значение или будут содержать значения префикса и идентификатора из записи BookingLeg.Когда вы запускаете это, вы получаете ошибку, что AddressDetails был настроен с конфликтующей информацией о сопоставлении.Я пробовал множество разных способов отобразить это, но нигде не нашел - может кто-нибудь сказать мне, что мне нужно сделать?

1 Ответ

0 голосов
/ 21 февраля 2019

Удалить строку

HasOptional(Function(x) x.AddressDetails).WithRequired(Function(x) x.BookingLeg).Map(Function(x) x.MapKey("Prefix", "ID"))

из класса BookingLegConfig.Каждые отношения должны быть настроены только один раз в одном месте (часть конфигурации любого из двух задействованных объектов, но не в обоих).В этом конкретном случае вам следует хранить вторую конфигурацию внутри BookingLegAddressConfig class

HasRequired(Function(x) x.BookingLeg).WithOptional(Function(x) x.AddressDetails).Map(Function(x) x.MapKey("JobLegPrefix", "JobLegID"))

, поскольку она указывает правильные имена столбцов FK.

Также EF6 не поддерживает явный FK столбцы для этого типа отношений - нет HasForeignKey свободно API, а MapKey предназначен для указания shadow имен свойств (и столбцов).Поэтому дополнительно удалите свойства JobLegPrefix и JobLegID из класса BookingLegAddress:

Partial Public Class BookingLegAddress
  Public Property Prefix As String
  Public Property ID As Integer
  Public Property Address As String
  Public Overridable Property BookingLeg As BookingLeg
End Class
...