【问题标题】:Self referencing entity CRUD EF CORE自引用实体 CRUD EF CORE
【发布时间】:2018-07-29 19:53:52
【问题描述】:

我无法为自引用实体进行 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.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 应该是什么样子的任何想法?

感谢任何答案。

【问题讨论】:

  • 你是否删除了 startup.cs 中的循环引用?
  • 我已经有了。
  • 它看起来你的同一个类也充当主键表和外键表
  • 是的,但是有没有办法在没有关键关系的情况下实现这种解决方案?
  • 你想要Has/With关系在同一模型中同时充当pk和fk吗?

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


【解决方案1】:

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

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

喜欢

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
}

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

【讨论】:

    【解决方案2】:

    编辑的问题应该如何看起来像创建/更新参考实体将起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2021-04-14
      • 2021-01-02
      相关资源
      最近更新 更多