具有多个可选的一对一关系的实体框架表

本文关键字:一对一 关系 框架 实体 | 更新日期: 2023-09-27 18:08:06

有几个问题,但没有一个对我有很大帮助,所以我决定问我自己的问题。

我想使用实体框架代码首先创建一个奇怪的关系。我有三个实体(Qualification, TestProcedure),它们都可以选择拥有一个(多个)文档。我试图将所有文档存储在一个表中。如何配置所有这些实体之间的关系。

  • Qualification有一对一可选的Document
  • Test有一对一可选的Document
  • Procedure有一对多可选Documents

Document必须与QualificationTestProcedure中的一个有关系。

public class Assessment
{
    public int AssessmentId { get; set; }
    //Other properties in Assessment
    public Document Document { get; set; }
}
public class Qualification
{
    public int QualificationId{ get; set; }
    //Other properties in Qualification
    public Document Document { get; set; }
}
public class Procedure
{
    public int ProcedureId { get; set; }
    //Other properties in Procedure
    public ICollection<Document> Documents { get; set; }
}
public class Document
{
    public int DocumentId { get; set; }
    //Other properties in Document
    public Qualification Qualification { get; set; }
    public Assessment Assessment { get; set; }
    public Procedure Procedure { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Not sure what goes here, but this was not working 
    modelBuilder.Entity<Document>()
        .HasOptional(d => d.Qualification).WithOptionalPrincipal(q => q.Document);
    modelBuilder.Entity<Document>()
        .HasOptional(d => d.Asssessment).WithOptionalPrincipal(q => q.Document);
}

当添加迁移时,我得到一个错误:

无法确定类型之间关联的主体结束。该关联的主体端必须使用关系流畅API或数据注释显式配置。

我不知道该怎么做。我在AssessmentQualification中有一个可空的int DocumentId,但这不起作用b/c Procedure可以保存一个集合,所以Document必须保存Id。Document是否为每个可能的父级持有可空的Id ?请帮助。

具有多个可选的一对一关系的实体框架表

在您的映射中,您将Document设置为主体,但实际上它是从属的。因此,您应该将映射更改为:

modelBuilder.Entity<Document>()
    .HasRequired(d => d.Qualification)
    .WithOptionalDependent(q => q.Document);
modelBuilder.Entity<Document>()
    .HasRequired(d => d.Asssessment)
    .WithOptionalDependent(q => q.Document);