我无法在实体框架中定义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
表中定义。
答案 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)