C# 实体框架:保存新父项,不保存新子项

C# 实体框架:保存新父项,不保存新子项,c#,entity-framework,C#,Entity Framework,我有以下课程: public class ParentObject { [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] public int Id { get; set; } public string Name { get; set; } [ForeignKey("ParentId")] public List<ChildObject> ChildObjects { g

我有以下课程:

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; }
}
公共类ParentObject{
[DatabaseGenerated(DatabaseGenerateOptions.Identity),键]
公共int Id{get;set;}
公共字符串名称{get;set;}
[ForeignKey(“ParentId”)]
公共列表子对象{get;set;}
}
公共类子对象{
[DatabaseGenerated(DatabaseGenerateOptions.Identity),键]
公共int Id{get;set;}
public int ParentId{get;set;}
公共字符串名称{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();
    }
}
private void Add(字符串parentName,字符串childName){
使用(MyDbContext=newmydbcontext()){
ParentObject newParent=newparentobject{Name=parentName};
ChildObject newChild=newchildobject{Name=childName};
newParent.ChildObjects=新列表{newChild};
context.ParentObjects.Add(newParent);
SaveChanges();
}
}

父项保存到数据库中,但子项不保存。我的理解是,具有外键约束应该将所有内容绑定在一起(外键存在于DB表中)。我无法找出我缺少的内容,无法使子对象保存到数据库。

集合属性必须是
虚拟的

public virtual ICollection<ChildObject> ChildObjects { get; set; }
公共虚拟ICollection子对象{get;set;}

任何导航属性都是这样,而不仅仅是集合。如果没有
virtual
关键字,EntityFramework的动态代理无法覆盖该属性并执行您希望它执行的外键跟踪。

集合属性必须是
virtual

public virtual ICollection<ChildObject> ChildObjects { get; set; }
公共虚拟ICollection子对象{get;set;}

任何导航属性都是这样,而不仅仅是集合。如果没有
virtual
关键字,EntityFramework的动态代理将无法覆盖该属性并执行希望它执行的外键跟踪。

在ChildObject中创建实例父对象的属性

public ParentObject Parent { get; set; }

实体框架将检测是否存在外键。还可以添加ForeignKeyAttribute

在ChildObject中创建实例父对象的属性

public ParentObject Parent { get; set; }

实体框架将检测是否存在外键。还可以添加ForeignKeyAttribute

你不需要有双向导航属性就可以让它工作。你不需要有双向导航属性就可以让它工作。你的代码对我来说工作得很好(我在控制台应用程序中尝试过)如果只使用
数据注释
,你设置
[ForeignKey(“ParentId”)]
的方式看起来很奇怪,它要求您需要在
ChildObject
类中声明导航属性
Parent
,并在该属性上应用
[ForeignKey(“ParentId”)]
。否则,我认为您需要使用fluentapi。问题可能是您的表/模型未正确设置/配置。您的代码对我来说运行良好(我在控制台应用程序中尝试过)。如果仅使用
数据注释,您设置
[ForeignKey(“ParentId”)]
的方式看起来很奇怪,它要求您需要在
ChildObject
类中声明导航属性
Parent
,并在该属性上应用
[ForeignKey(“ParentId”)]
。否则,我认为您需要使用fluentapi。问题可能是您的表/模型未正确设置/配置。它不需要是虚拟的。我尝试在控制台应用程序中,没有虚拟。。。它工作得很好,不需要是虚拟的。我尝试在控制台应用程序中,没有虚拟。。。而且效果很好