首页 > 解决方案 > 如何在子更新上修改父实体?(一对多)

问题描述

我正在开发一个带有 .net EF 核心的 .net core 2.2 web api,我有一个任务表和一个拒绝表。

每个任务可以有 0 个或多个拒绝,每个拒绝有一个任务。

(任务 1<--->* 拒绝)

每个拒绝都具有以下两种状态之一:REJECT_TODO、REJECT_DONE。

每个任务都有以下三种状态之一:TODO、DONE、REJECTED。

需要以下行为:如果任务的拒绝状态为:REJECT_TODO,则它被拒绝。

如果任务没有拒绝或仅拒绝具有状态:REJECT_DONE,那么它可能是 TODO/DONE。

此外,从数据库中提取以进行检查的拒绝不会使用当前更改进行更新,因此更新/删除的拒绝将显示为不变。

(beeing REJECTED 后的默认状态是 TODO)

我希望所有这些对于拒绝的任何 CRUD 操作都是自动的。

我已经尝试对 DbContext::SaveChanges 中的拒绝实体进行迭代更改。

问题是我需要在数据库中查询未更新的 Task 实体,并为该任务执行更新,这将覆盖对当前 SaveChanges 调用所做的任何更改。

由于同样的原因,我不能把它放在我的 DAL 上。

    public class Task
    {
        [Key]
        public Guid Id { get; set; }

        public string Title { get; set; }

        public TaskStatus Status { get; set; }

        public List<Reject> Rejects { get; set; }  
    }

    public class Reject
    {
        [Key]
        public Guid Id { get; set; }

        public string Description { get; set; }

        public RejectStatus Status { get; set; }

        public Guid TaskId { get; set; }
    }

    public enum TaskStatus
    {
        TODO, DONE, REJECTED
    }

    public enum RejectStatus
    {
        REJECT_TODO, REJECT_DONE
    }

预期成绩:

创建:如果一个拒绝被添加到一个任务(默认使用 REJECT_TODO)然后父任务将被拒绝

删除/更新:如果从任务中删除/更新了拒绝,那么如果该任务不再有状态为 REJECT_TODO 的拒绝,它将是 TODO

谢谢!:)

标签: c#.net-coreentity-framework-core

解决方案


推荐阅读