我无法在实体框架中定义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创建新的迁移,因为已经在Attachment表中定义了FK。
发布于 2016-08-10 19:44:01
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)https://stackoverflow.com/questions/38870368
复制相似问题