C# 自引用实体无法确定从属操作的有效顺序

C# 自引用实体无法确定从属操作的有效顺序,c#,entity-framework,C#,Entity Framework,正在尝试创建具有自引用的类注释,因为一个注释可以由多个注释共享,具有1-n关系。我在SharedNoteID属性中添加了外键,并使其可为null。不管怎样,我还是会 “无法确定从属操作的有效顺序” 当我试图保存便笺时,即使是第一个便笺(SharedNoteID为null时也是如此)。我首先使用实体框架6.1.3代码。怎么了 这是我的实体 public class Note { public Note() { SharingNotes = new List<N

正在尝试创建具有自引用的类注释,因为一个注释可以由多个注释共享,具有1-n关系。我在
SharedNoteID
属性中添加了外键,并使其
可为null
。不管怎样,我还是会

“无法确定从属操作的有效顺序”

当我试图保存便笺时,即使是第一个便笺(SharedNoteID为null时也是如此)。我首先使用实体框架6.1.3代码。怎么了

这是我的实体

public class Note
{
    public Note()
    {
        SharingNotes = new List<Note>();
    }

    public long ID { get; set; }

    //other properties

    public long? SharedNoteID { get; set; }

    [ForeignKey("SharedNoteID")]
    public Note SharedNote { get; set; }

    public virtual ICollection<Note> SharingNotes { get; set; }
}
公共课堂笔记
{
公共说明()
{
SharingNotes=新列表();
}
公共长ID{get;set;}
//其他属性
public long?SharedNoteID{get;set;}
[ForeignKey(“SharedNoteID”)]
公共注释SharedNote{get;set;}
公共虚拟ICollection共享说明{get;set;}
}
这是我的DBContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        base.OnModelCreating(modelBuilder);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
基于模型创建(modelBuilder);
}

我发现了问题。它不在EF代码中,而是在控制器(asp.net 5)中。这就是错误:

public ViewResult Create(long sharedNote=0)
{
    Note note = new Note();
    note.SharedNoteID = sharedNote;
    return View(note);
}
我不得不改成

public ViewResult Create(long? sharedNote)
{
    Note note = new Note();
    note.SharedNoteID = sharedNote;
    return View(note);
}

我发现了问题。它不在EF代码中,而是在控制器(asp.net 5)中。这就是错误:

public ViewResult Create(long sharedNote=0)
{
    Note note = new Note();
    note.SharedNoteID = sharedNote;
    return View(note);
}
我不得不改成

public ViewResult Create(long? sharedNote)
{
    Note note = new Note();
    note.SharedNoteID = sharedNote;
    return View(note);
}

数据库是平面的,不能嵌套表。您需要做的是使表包含具有唯一id的主键字段。然后引用主键。键通常是数字或字符串和数字。号码是唯一的。@jdweng找不到您。ID是主键,SharedNodeId是引用ID的外键。但是EF如何知道
ID
是主键?我个人喜欢让所有东西都清晰可见,所以我首先用
KeyAttribute
装饰
ID
,用
InversePropertyAttribute
装饰导航属性。不确定它是否有帮助,但是…@Grx70 EF应该知道,因为命名约定。ID或NoteID将被视为主键。无论如何,尝试添加key和InverseProperty属性,但没有成功。这很公平。你确定没有任何循环引用或类似的东西吗?另外,作为旁注,
SharedNote
属性不是故意或错误地虚拟的吗?数据库是平面的,不能嵌套表。您需要做的是使表包含具有唯一id的主键字段。然后引用主键。键通常是数字或字符串和数字。号码是唯一的。@jdweng找不到您。ID是主键,SharedNodeId是引用ID的外键。但是EF如何知道
ID
是主键?我个人喜欢让所有东西都清晰可见,所以我首先用
KeyAttribute
装饰
ID
,用
InversePropertyAttribute
装饰导航属性。不确定它是否有帮助,但是…@Grx70 EF应该知道,因为命名约定。ID或NoteID将被视为主键。无论如何,尝试添加key和InverseProperty属性,但没有成功。这很公平。你确定没有任何循环引用或类似的东西吗?另外,作为旁注,
SharedNote
属性不是故意或错误地虚拟的吗?