我正在尝试使用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)
,那么一切都会好的。
那么,我做错了什么?为什么不将父记录与其子记录一起添加到表中?如何在不进行上述替换的情况下实现所需的行为?
任何帮助将不胜感激。
答案 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();
}
如果这有助于你不要忘记将其标记为答案:)