【发布时间】:2016-04-20 18:41:42
【问题描述】:
我知道还有其他人问过同样的问题,答案是处理引用而不是 ID。
就我而言,我的实体框架有一个奇怪的行为:它在一种情况下(父子)有效,但在另一种情况下(子孙)无效。
这是我的模型:
public class Parent
{
public int ID { get; set; }
public string Name { get; set; }
public List<Child> Children { get; set; } = new List<Child>();
}
public class Child
{
public int ID { get; set; }
public int ParentID { get; set; }
public string Name { get; set; }
public List<GrandChild> GrandChildren { get; set; } = new List<GrandChild>();
public Parent Parent { get; set; }
}
public class GrandChild
{
public int ID { get; set; }
public int ChildID { get; set; }
public String Name { get; set; }
public Child Child { get; set; }
}
这是我的映射:
public class ParentConfig : EntityTypeConfiguration<Parent>
{
public ParentConfig()
{
HasKey(e => e.ID);
Property(e => e.ID).HasColumnName("ID");
Property(e => e.Name).HasColumnName("Name");
HasMany(e => e.Children).WithRequired(c => c.Parent).HasForeignKey(c => c.ParentID);
ToTable("Parent");
}
}
public class ChildMap : EntityTypeConfiguration<Child>
{
public ChildMap()
{
HasKey(e => e.ID);
Property(e => e.ID).HasColumnName("ID");
Property(e => e.Name).HasColumnName("Name");
Property(e => e.ParentID).HasColumnName("ParentID");
HasMany(c => c.GrandChildren).WithRequired().HasForeignKey(c => c.ChildID);
HasRequired(e => e.Parent).WithMany().HasForeignKey(e => e.ParentID);
ToTable("Child");
}
}
public class GrandChildMap : EntityTypeConfiguration<GrandChild>
{
public GrandChildMap()
{
HasKey(e => e.ID);
Property(e => e.ID).HasColumnName("ID");
Property(e => e.ChildID).HasColumnName("ChildID");
Property(e => e.Name).HasColumnName("Name");
HasRequired(e => e.Child).WithMany().HasForeignKey(e => e.ChildID);
ToTable("GrandChild");
}
}
这是我的代码:
Parent parent = new Parent { Name = "Parent", };
Child child_1 = new Child { Name = "Child 1", Parent = parent };
Child child_2 = new Child { Name = "Child 2", Parent = parent };
GrandChild grandChild_1 = new GrandChild { Name = "GrandChild 1", Child = child_2 };
GrandChild grandChild_2 = new GrandChild { Name = "GrandChild 2", Child = child_2 };
context.Parents.Add(parent);
//no need to call SaveChanges
context.Children.Add(child_1);
context.Children.Add(child_2);
//SaveChanges() is needed here
context.GrandChildren.Add(grandChild_1);
context.GrandChildren.Add(grandChild_2);
context.SaveChanges();
此代码失败并显示消息
'无法确定 Child_GrandChildren 的主体端 关系。多个添加的实体可能具有相同的主键'
但如果我在添加孩子后保存,但我确实需要在添加父母后调用SaveChanges()。
编辑:如果我删除属性 List<GrandChild> GrandChildren 它可以工作,但我真的需要它。
这是一个错误吗?
【问题讨论】:
标签: c# entity-framework relationship