实体框架:保存新父节点,不保存新子节点

本文关键字:保存 子节点 父节点 框架 实体 | 更新日期: 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。