无法确定类型“X”和“X”之间关联的主要结束

时间:2017-06-21 14:57:28

标签: c# asp.net-mvc entity-framework asp.net-web-api ef-code-first

我正在使用self-reference,这是我的实体模型:

self-reference

并且正如您所见,它具有Public class Document { Public int Id { get; set; } Public Document Parent { get; set; } Public Document SrcDocument { get; set; } } 属性。

现在我正在尝试添加另一个SELECT distinct a.StudentID, b.Coin FROM table a Join ( Select Student ID, CASE WHEN Coin = 'Tails' then 'Tails' Else 'heads' END Coin From table ) b on b.student_id = a.student_id 属性:

server.port=8443
server.ssl.key-store=classpath:certs/localhost.keystore
server.ssl.key-store-password=somepass
server.ssl.key-password=somepass

但不幸的是我遇到了以下错误:

  

无法确定类型“文档”和“文档”之间关联的主要结尾。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

2 个答案:

答案 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关系。

我会工作。

答案 1 :(得分: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);