关于我如何双重映射这种父子关系的任何建议,其中父亲具有正常的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;不可用。
答案 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()