自引用实体CRUD EF CORE

时间:2018-07-28 07:26:53

标签: c# .net entity-framework-core crud

我很难为自引用实体进行CRUD。

这是我的实体:

public class Category
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Recipe> Recipes { get; set; } = new HashSet<Recipe>();
    public int? ParentId { get; set; }
    public virtual Category Parent { get;set; }
    public virtual ICollection<Category> Categories { get; set; } = new HashSet<Category>();
}

ModelBuilder:

modelBuilder.Entity<Category>()
    .WithMany(c => c.Categories)
    .HasOne(c => c.Parent)
    .HasForeignKey(c => c.ParentId);

我的创建逻辑:

public void Save(Category category)
{
    if(category.Parent != null && category.Parent.Id == 0)
    {
       category.Parent = null;
    }
    else
    {
        _db.Entry(category.Parent).State = EntityState.Unchanged;
    }
    _db.Category.Add(category);
    _db.SaveChanges();
}

更新逻辑:

public void Update(Category category)
{
    _db.Category.Update(category);
    _db.SaveChanges();
}

CategoryDto类:

public class CategoryDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public CategoryDto Parent { get; set; }
}

我无法将此object保存到数据库,因为似乎Parent也要保存,因此需要获取Name字段。

有什么想法对自引用实体来说CRUD应该是什么样子?

任何答案都值得赞赏。

2 个答案:

答案 0 :(得分:1)

您必须配置序列化程序以忽略项目中的循环引用。

为此,您必须在ConfigureServices的{​​{1}}方法内添加以下代码行

喜欢

Startup.cs

添加此行代码后,您将能够在具有循环引用的表中插入记录。

答案 1 :(得分:0)

已编辑的问题,如何使参照实体的创建/更新看起来一切正常。