2016-09-21 197 views
1

有幾個問題,但沒有一個對我有太大的幫助,所以我決定問我自己。實體框架表與多個可選的一對一關係

我想先使用實體​​框架代碼創建一個奇怪的關係。我有三個實體(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?請幫助。

回答

1

在您的映射中,您將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