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

问题描述:

有几个问题,但没有一个对我有太大的帮助,所以我决定问我自己。实体框架表与多个可选的一对一关系

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

  • Qualification具有一对一的可选Document
  • Test具有一对一的可选Document
  • Procedure具有一个到许多可选Documents

Document具有一个QualificationTest所需关系或Procedure

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); 
} 

当增加一个移民,我得到一个错误:

Unable to determine the principal end of an association between the types. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我不知道如何做到这一点。我有一个可空的int DocumentIdAssessmentQualification但这不起作用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); 
+0

那么'HasRequired'是否意味着文档需要'Qualification'和'Assessment'? 'Procedure'和它的可选对象之一是否需要做任何事情? – JaredStroeb

+0

它有助于EntityFramework定义主体端点。如果您依赖[约定](https://msdn.microsoft.com/en-us/data/jj679962.aspx),则通常不需要做任何事情来配置关系。但是您也可以将其配置为'modelBuilder.Entity ().HasRequired(m => m.Procedure).WithMany(m => m.Documents);' –

+0

在一般的One-to-One关系中,孩子是父母的外键。因为我正在使用一个数据库生成的整数作为导致'Document'中的主键冲突的父主键的主键?如果'资格''评估'是数据库中的第一个关键字为1,并且为两者添加“文档”会是一个问题? – JaredStroeb