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); 
相关问题