C#EF核心:更新父级时,子级行被删除

时间:2020-09-13 22:21:12

标签: c# entity-framework

大家好,我对EF核心版本6.4.4有问题。

我正在开发一个使用MySQL(8.x)作为数据库的多线程.NET Core(3.1)应用程序(不是问题,而只是提供上下文)。

我当前遇到的问题是,当我更新父行时不会删除子行,这不会导致崩溃,但会导致数据丢失,因为我每秒都在收集数据以创建图表。 / p>

最初我没有这个问题,但是当我开始添加外键约束,索引并重构代码以进行优化时,我突然遇到了这个问题。

我尝试过的事情

因此,起初我以为EF核心在更新另一个实体时将父级设置为null,或者可能是某些必填字段(其中null导致删除),但事实并非如此,因此我尝试使用Z.EntityFramework.Extensions。 EFCore具有执行单个更新的能力(这意味着我将仅更新给定的实体,也不会更新所引用的实体),但这并不能解决问题。

我还检查了所有索引和外键,以允许重复项确保我没有删除行,因为该行具有重复项。我所有的索引都允许重复的行(通过设置unique为false)。

课程

public  class Parent
{
    
    public int Id { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public ParentSatus Status { get; set; } //this is the property that I want to update

    public decimal valueX{ get; set; }

    public decimal valueY{ get; set; }
}

public  class Child
{
    
    public  int Id { get; set; }
    public  string Name { get; set; }
    public  decimal SomeValue{ get; set; }
    public  decimal SomeValue2{ get; set; }
    public string IdForExternalAPI { get; set; }
    public DateTime CreatedAt { get; set; }
    public ChildStatus Status { get; set; }
    public  ChildType Type { get; set; }
    public  virtual Parent Parent { get; private set; }
    public virtual int ParentId { get; set; } //This is for foreignkey constraint stuff see below
}

ModelBuilder

 protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Child>().HasOne(e => e.Parent).WithOne().HasForeignKey<Child>(e => e.ParentId).OnDelete(DeleteBehavior.Cascade).IsRequired();

        modelBuilder.Entity<Parent>().HasIndex(e => e.SomeIndex).IsUnique(false);
        modelBuilder.Entity<Child>().HasIndex(e => e.ParentId).IsUnique(false);
    }

因此,很明显,这种关系是一对一的,这可能是原因,但我不希望一对一,因为父级需要被其他一些类引用,并且Child也是该级的父级其他一些课程。

有人可以帮忙吗? 如果有一天我会添加答案。

也要澄清一下:我没有添加所有多余的东西,因为它们不涉及此问题,但是在必要时会添加它。

编辑:

我更新父级的代码

 foreach (var parent in parentRepository.ReadParents(new Func<Parent, bool>(e => e.Status == Status.ONGOING)).ToList())
        {
            bool isStillOngoing = //Calculate the current status based on other entities
            if (!isStillOngoing)
            {
               //Do some calculations here
            }

            parent.Status = isStillOngoing ? Status.ONGOING : Status.FINISHED;
            //TODO: Bug here that deletes the child
            parentRepository.UpdateParent(parent);
        }

1 个答案:

答案 0 :(得分:0)

好,我通过扭转关系来修复它。昨天我好像太累了,应该不多。

通过更改模型构建器进行修复。

修复

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Parent>().HasMany<Child>().WithOne(e=> e.ParentId).HasForeignKey(e => e.ParentId).OnDelete(DeleteBehavior.Cascade).IsRequired();

    modelBuilder.Entity<Parent>().HasIndex(e => e.SomeIndex).IsUnique(false);
    modelBuilder.Entity<Child>().HasIndex(e => e.ParentId).IsUnique(false);
}

谢谢大家的帮助。