大家好,我对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);
}
答案 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);
}
谢谢大家的帮助。