我正在尝试建立一个具有可选关系的 Entity Framework 模型:可选关系:
在我的情况下,有时存在指向 BaseTable 记录的 AdditionalData 记录,但有时 BaseTable 或 AdditionalData 记录存在时没有任何链接。 BaseTable 的外键(如果存在)在 AdditionalData 表上。
我希望能够在 BaseTable 和任何可能连接的 AdditionalData 之间来回导航。
BaseTable 0..1 ----- 0..1 AdditionalData1
\
--- 0..1 AdditionalData2
public class BaseTable {
public int Id { get; set; }
public virtual AdditionalType1 AdditionalType1 { get; set; }
public virtual AdditionalType2 AdditionalType2 { get; set; }
}
public class AdditionalType1 {
public int Id { get; set; }
public int? BaseTableId { get; set; }
public virtual BaseTable BaseTable { get; set; }
}
public class AdditionalType2 {
public int Id { get; set; }
public int? BaseTableId { get; set; }
public virtual BaseTable BaseTable { get; set; }
}
我如何使它起作用?我做到了:
modelBuilder.Entity<AdditionalType1>()
.HasOptional(zmt => zmt.BaseTable)
.WithOptionalDependent(zm => zm.AdditionalType1)
.Map(a => a.MapKey("BaseTableId"));
modelBuilder.Entity<AdditionalType2>()
.HasOptional(zmt => zmt.BaseTable)
.WithOptionalDependent(zm => zm.AdditionalType2)
.Map(a => a.MapKey("BaseTableId"));
但它告诉我:
error: (1564,6) : error 0019: Each property name in a type must be unique. Property name 'BaseTableId' was already defined.
我不确切知道那指的是什么,也不确定如何解决。
编辑:如果我按照此处的建议删除 Map/MapKey 子句 (https://stackoverflow.com/a/8016308/237091),当使用它的查询运行时,我会收到此错误:
Invalid column name 'BaseTable_Id' as it maps itself to BaseTable_Id automatically instead of my BaseTableId field.
最佳答案
看起来您正在尝试从您的 AdditionalType
对象建立一个 1:0..1 的关系(我可能完全误解了它。
注意我认为你必须在你的 BaseTable
上持有一个 BaseTableId 才能工作(或定义一个主键):
如果 BaseTableId
是这个实例中的外键,我认为这可能是您想要的:
modelBuilder.Entity<AdditionalType1>()
.HasOptional(zmt => zmt.BaseTable)
.WithMany()
.HasForeignKey(a => a.BaseTableId);
这是我以前用过的,但不能承认完全理解它(.WithMany() 让我失望);这是此答案的文章中列出的一个小解决方法:Entity Framework 0..1 to 0 relation )
如果我完全错过了要点,我深表歉意。
关于c# - Entity Framework 可选 :optional relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17346231/