Entity Framework表具有多个可选的一对一关系

时间:2016-09-21 21:04:41

标签: c# sql-server entity-framework

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

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

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

DocumentQualificationTestProcedure之间存在必需的关系。

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或数据注释显式配置此关联的主要结尾。

我不知道该怎么做。我在DocumentIdAssessment中有一个可以为空的Qualification,但是这不起作用b / c Procedure可以保存一个集合,因此Document必须包含Id。 Document是否为每个可能的父级保留了可空的ID?请帮助。

1 个答案:

答案 0 :(得分:1)

在你的映射中,你将Document设置为主体,但实际上它是依赖的。所以你应该将你的映射改为:

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

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