无法正确定义EF 1到0..1的关系

时间:2016-08-10 10:10:20

标签: c# entity-framework

我无法在实体框架中定义1:0..1关系。

我有“PerfData”和“AttachmentData”实体。 Perf是父实体,它有零个或一个Attachment

在代码AttachmentData.CustomForeignKeyId中FK为PerfData.Id,但在数据库中FK应该有不同的名称Attachment.PerfId是FK到PerfData.Id(这是由于某些基类和继承我在这里没有描述。)

public class AttachmentData {
   ... 
   public Guid Id {get;set;}
   public Guid CustomForeignKeyId{ get; set; } // this is FK to Perf.Id
   public PerfData Perf { get; set; } // navigation property
}

和相应的配置

internal class AttachmentDataConfig : BaseConfig<AttachmentData>
    {
        public AttachmentDataConfig () : base("Attachment")
        {
            Property(x => x.CustomForeignKeyId)
                .HasColumnName("PerfId");

            HasRequired(o => o.Perf)
                .WithMany()
                .HasForeignKey(f => f.CustomForeignKeyId)
                .WillCascadeOnDelete(true);
        }
    }

如果我只有这个,它可以正常工作。正确生成迁移。但是,我还需要在另一边有导航属性:

public class PerfData {
    public Guid Id {get;set;}    
    public AttachmentData> Attachment { get; set; } //navigation property
}

如果我添加此导航属性,则EF使用新列Perf.Attachment_Id创建新的迁移,这是不必要的,因为FK已在Attachment表中定义。

1 个答案:

答案 0 :(得分:0)

EF在依赖方不支持与显式FK列的1:0..1关系(它认为这种关系为1:0..N)。对于1:0..1,它使用所谓的Shared Primary Key Associations,其中从属方的PK也是主方的FK。

话虽如此,在你的模型中,CustomForeignKeyId是多余的。正确的(从EF角度来看)模型将是这样的:

public class PerfData
{
    public Guid Id { get; set; }    
    public AttachmentData Attachment { get; set; } //navigation property
}

public class AttachmentData {
   ... 
   public Guid Id { get; set;}
   public PerfData Perf { get; set; } // navigation property
}

使用以下配置:

internal class AttachmentDataConfig : BaseConfig<AttachmentData>
{
    public AttachmentDataConfig() : base("Attachment")
    {
        HasRequired(e => e.Perf)
            .WithOptional(e => e.Attachment)
            .WillCascadeOnDelete(true);
    }
}

UPATE:如果要保留现有的FK字段并使用1:0..N关系,请更改PerfData类导航属性

public AttachmentData Attachment { get; set; }

public ICollection<AttachmentData> Attachments { get; set; }

并在配置中

.WithMany()

.WithMany(e => e.Attachments)