7

我正在尝试设置具有可选:可选关系的实体框架模型:

在我的情况下,有时存在指向 BaseTable 记录的 AdditionalData 记录,但有时存在 BaseTable 或 AdditionalData 记录而没有任何链接。BaseTable 的外键(如果存在)在 AdditionalData 表上。

我希望能够在 BaseTable 和可能连接的任何 AdditionalDatas 之间来回导航。

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"));

但它告诉我:

错误:(1564,6):错误0019:类型中的每个属性名称必须是唯一的。已定义属性名称“BaseTableId”。

我不知道具体指的是什么,也不知道如何解决。

编辑:如果我按照此处的建议删除 Map/MapKey 子句(https://stackoverflow.com/a/8016308/237091),当使用它的查询运行时,我会收到此错误:

列名“BaseTable_Id”无效,因为它自动将自身映射到 BaseTable_Id 而不是我的 BaseTableId 字段。

4

1 回答 1

5

看起来你正试图从你的AdditionalType对象建立一个 1:0..1 的关系(我可能完全误解了。

注意我认为你必须在你的 BaseTableId 上保存一个BaseTable才能工作(或定义一个主键):

如果BaseTableId在这种情况下是外键,我认为这可能是您所追求的:

modelBuilder.Entity<AdditionalType1>()
    .HasOptional(zmt => zmt.BaseTable)
    .WithMany()
    .HasForeignKey(a => a.BaseTableId);

这是我以前使用过的,但不能承认完全理解它( .WithMany() 让我绊倒);这是这个答案的文章中列出的一个轻微的解决方法:Entity Framework 0..1 to 0 relationship

如果我完全错过了重点,我深表歉意。

于 2013-06-27T15:06:45.950 回答