添加子记录后,父记录不会添加到数据库中

时间:2014-06-09 01:14:35

标签: c# database entity-framework ef-code-first relational-database

我正在尝试使用Code First方法创建一个包含单个自引用表“Categories”的数据库。以下是类别POCO实体的定义:

public class Category
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CategoryId { get; private set; }
    public string Name { get; set; }
    public int? ParentCategoryId { get; private set; }

    [ForeignKey("ParentCategoryId")]
    public Category ParentCategory { get; set; }
    public List<Category> SubCategories { get; set; }
    public Category()
    {
        SubCategories = new List<Category>();
    }
}

以下是数据库的DbContext子类的定义:

public class CategoryContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public CategoryContext()
        : base("name=CategoriesEntities") { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Category>().HasMany(cat => cat.SubCategories).WithOptional(cat => cat.ParentCategory).HasForeignKey(cat => cat.ParentCategoryId);
    }
}

现在我正试着填写表格:

using (var context = new CategoryContext())
{
    var child = new Category { Name = "child" };
    var parent = new Category { Name = "parent" };
    parent.SubCategories.Add(child);
    //child.ParentCategory = parent;
    context.Categories.Add(child);
    //context.Categories.Add(parent);
    context.SaveChanges();
}

但是我在结果表中看到的唯一记录是“子”记录。但是如果我将parent.SubCategories.Add(child)行更改为child.ParentCategory = parent行,一切都会正常工作,表格将包含两个记录。如果我将context.Categories.Add(child)更改为context.Categories.Add(parent),那么一切都会好的。

那么,我做错了什么?为什么不将父记录与其子记录一起添加到表中?如何在不进行上述替换的情况下实现所需的行为?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您收到此行为是因为您只是说要添加chield

context.Categories.Add(child);

如果您查看您的子对象,它与您的父对象没有关联,但是您的父对象与子对象(单向关系),所以当您执行context.Categories.Add(child); EF对父母没有任何线索

所以正确的方法是只添加父对象

context.Categories.Add(parent);

更改的代码应该类似于

using (var context = new CategoryContext())
{
    var child = new Category { Name = "child" };
    var parent = new Category { Name = "parent" };
    parent.SubCategories.Add(child);
    context.Categories.Add(parent);
    context.SaveChanges();

}

如果这有助于你不要忘记将其标记为答案:)