实体框架:保存新父节点,不保存新子节点
本文关键字:保存 子节点 父节点 框架 实体 | 更新日期: 2023-09-27 18:14:44
我有以下类:
public class ParentObject {
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("ParentId")]
public List<ChildObject> ChildObjects { get; set; }
}
public class ChildObject {
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
我有一个方法来添加新的父级和新的子级:
private void Add(string parentName, string childName) {
using (MyDbContext context = new MyDbContext ()) {
ParentObject newParent = new ParentObject { Name = parentName };
ChildObject newChild = new ChildObject { Name = childName };
newParent.ChildObjects = new List< ChildObject> { newChild };
context.ParentObjects.Add(newParent);
context.SaveChanges();
}
}
父节点被保存到数据库中,但子节点没有。我的理解是,拥有外键约束应该将所有内容联系在一起(外键存在于DB表上)。我不知道我错过了什么让孩子保存到数据库
集合属性需要为virtual
public virtual ICollection<ChildObject> ChildObjects { get; set; }
对于任何导航属性都是这样,不仅仅是集合。如果没有virtual
关键字,EntityFramework的动态代理将无法覆盖该属性并执行您希望它执行的外键跟踪。
在你的ChildObject中创建一个实例Parent的属性。
public ParentObject Parent { get; set; }
实体框架将检测到存在外键。你也可以添加一个ForeignKeyAttribute。