如何使用Fluent API映射此冗余父子关系

时间:2015-05-15 13:26:56

标签: entity-framework ef-code-first entity-framework-6 ef-fluent-api

关于我如何双重映射这种父子关系的任何建议,其中父亲具有正常的1-many关系(这是有效的),但是我需要从父母到父母的直接1:1,0链接一个特别的孩子。

Public Class Source
    <Key()>
    Public Property SourceID As Int32

    Public Property SourceFields As List(Of SourceField)

    Public Property InboundMatchKeySourceFieldID As Nullable(Of Int32)
    Public Property InboundMatchKeySourceField As SourceField

Public Class SourceField
    <Key()>
    Public Property SourceFieldID As Int32

    Public Property SourceID As Int32

    Public Property Source As Source

这是父/子映射(工作)

    modelBuilder.Entity(Of Source).HasMany(
        Function(S) S.SourceFields
    ).WithRequired(
        Function(SF) SF.Source
    ).HasForeignKey(
        Function(SF) SF.SourceID
    )

这是我尝试进行额外的直接映射(不工作):

modelBuilder.Entity(Of Source
    ).HasOptional(
        Function(S) S.InboundMatchKeySourceField
    ).WithRequired(
        Function(SF) SF.Source
    )

这让我得到了MetaDataException&#39;:

  

指定的架构无效。错误:关系   &#39; _____ Source_InboundMatchKeySourceField&#39;没装   因为类型&#39; _____。SourceField&#39;不可用。

2 个答案:

答案 0 :(得分:0)

.WithRequired(...)返回ForeignKeyNavigationPropertyConfiguration的实例。您需要使用map方法将此关系映射到Key,否则EF将尝试为您创建一个。

所以你要找的代码是:

modelBuilder.Entity(Of Source
).HasOptional(
    Function(S) S.InboundMatchKeySourceField
).WithRequired(
    Function(SF) SF.Source
) _
.Map(Function (x) x.MapKey("InboundMatchKeySourceFieldID"))

答案 1 :(得分:0)

您无法为两种关系使用相同的属性SourceField.Source

实体框架的观点含糊不清:

  • 如果设置someSourceField.Source,是否意味着someSourceField被添加到thatSource.SourceFields,或thatSource.InboundMatchKeySourceField被设置,或两者兼而有之?
  • 如果someSource.InboundMatchKeySourceField.Source != someSource
  • 怎么办?

也许你可以创建没有导航属性的第二个映射,并使用验证来确保SourceFields.Contains(InboundMatchKeySourceField)thisSource.InboundMatchKeySourceField.Source == thisSource如果需要:

modelBuilder.Entity(Of Source
    ).HasOptional(
        Function(S) S.InboundMatchKeySourceField
    ).WithRequired()