C# 自引用实体无法确定从属操作的有效顺序
正在尝试创建具有自引用的类注释,因为一个注释可以由多个注释共享,具有1-n关系。我在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
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
属性不是故意或错误地虚拟的吗?