Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自引用实体CRUD EF CORE_C#_.net_Entity Framework Core_Crud - Fatal编程技术网

C# 自引用实体CRUD EF CORE

C# 自引用实体CRUD EF CORE,c#,.net,entity-framework-core,crud,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> Recip

我无法为自引用实体执行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>();
}
更新逻辑:

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
class:

public class CategoryDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public CategoryDto Parent { get; set; }
}
我无法将此
对象
保存到数据库,因为似乎
父对象
也希望保存,需要获取该
名称
字段

你知道CRUD对于自引用实体应该是什么样子吗


非常感谢您的回答。

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

因此,您必须在
Startup.cs中的
ConfigureServices
方法中添加以下代码行


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

编辑问题“创建/更新引用实体”的工作原理应该是什么样子。

您是否在startup.cs中删除了循环引用?我已经删除了。看起来您的类与主键表和外键的作用相同表也有,但是否有任何方法可以实现这种没有关键关系的解决方案?您是否希望在充当pk和fk的同一模型中使用
Has/With
关系?
public class CategoryDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public CategoryDto Parent { get; set; }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
}