1

之間的關聯的主要結束我使用Entity Framework這裏是我的實體模型:無法確定類型的「X」和「X」

Public class Document 
{ 
    Public int Id { get; set; } 
    Public Document Parent { get; set; } 
} 

,當你看到它有一個self-reference屬性。

現在我想要添加另一個self-reference屬性是這樣的:

Public class Document 
{ 
    Public int Id { get; set; } 
    Public Document Parent { get; set; } 
    Public Document SrcDocument { get; set; } 
} 

但不幸的是,我遇到以下錯誤:

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

+0

難道你想與一個一對多的關係? –

+0

有些是如何,但它不起作用? – Reza

+0

是否會編寫任何代碼來定義這些關係? –

回答

2

實體框架Code-First約定假設DocumentDocument屬於相同的關係,並且是彼此的逆導航屬性。因爲兩個導航屬性都是引用(不是集合),EF推斷出one-to-one關係。

由於您實際上想要兩個one-to-many關係,您必須重寫這些約定。只是覆蓋範圍內的OnModelCreating方法,並把那裏你怎麼看這樣的新週期關係的想法:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Document>().HasRequired(p => p.SrcDocument).WithMany(); 
    base.OnModelCreating(modelBuilder); 
} 

更新

modelBuilder.Entity<Document>().HasRequired(p => p.SrcDocument).WithMany();說實體框架SrcDocument有本身one-to-many關係。

,你也可以使用下面的代碼:

modelBuilder.Entity<Document>().HasOptional(p => p.SrcDocument).WithMany(); 

做出zero-to-many關係。

以及與此:

modelBuilder.Entity<Document>().HasOptional(p => p.SrcDocument).WithOptionalDependent(); 

您可以定義一個one-to-zero關係。

我會工作。

+0

「既然你真的想要兩個一對多「這不是我正在閱讀的問題。此外,您的代碼段確實將其中一個屬性定義爲一對一或一對關係中的導航屬性。你應該簡化這些斷言,因爲那時答案可能是正確的。 – DevilSuichiro

+0

我已更新它。 –

1

嘗試使用InverseProperty屬性:

public class Document 
{ 
    public int Id { get; set; } 

    public virtual Document Parent { get; set; } 
    public int ParentId { get; set; } 

    public virtual Document SrcDocument { get; set; } 
    public int SrcDocumentId { get; set; } 

    [InverseProperty("Parent")] 
    public virtual ICollection<Document> Children {get;set;} 
    [InverseProperty("SrcDocument")] 
    public virtual ICollection<Document> Derived {get;set;} 
} 

遷移:

CreateTable(
    "dbo.Documents", 
    c => new 
     { 
      Id = c.Int(nullable: false, identity: true), 
      ParentId = c.Int(nullable: false), 
      SrcDocumentId = c.Int(nullable: false), 
     }) 
    .PrimaryKey(t => t.Id) 
    .ForeignKey("dbo.Documents", t => t.ParentId) 
    .ForeignKey("dbo.Documents", t => t.SrcDocumentId) 
    .Index(t => t.ParentId) 
    .Index(t => t.SrcDocumentId); 
相關問題