【问题标题】:Cyclic dependency check using EF Core使用 EF Core 进行循环依赖检查
【发布时间】:2020-02-14 10:20:17
【问题描述】:

我在使用 EF Core 3 时有以下要求。我有 (Id = 1 Pushup)、(Id = 2 Squat)、(Id = 3 Weight Lift) 和用户的练习。一旦完成一项练习,就会创建一个或多个新练习。可以使用 n 级创建多级层次结构。 我有一个问题,虽然这可能会导致练习的循环依赖。 例如俯卧撑 (1) 已完成。深蹲 (2) 已创建。深蹲 (2) 完成,然后创建举重 (3)。还有对举重(3)的依赖,一旦完成,它会创建俯卧撑(1)并导致循环依赖,我需要避免这种情况。 我举了一个非常简单的例子。在我的项目中,依赖关系可以达到 50 级,我不知道如何检查循环引用并避免它们。 下面是代码:

public class Exercise
{
    public Exercise()
    {
        ExerciseDependencyExercises = new HashSet<ExercisesDependency>();
        ExerciseDependencyTargetExercises = new HashSet<ExercisesDependency>();
        UserExercises = new HashSet<UserExercise>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<ExercisesDependency> ExerciseDependencyExercises { get; set; }
    public virtual ICollection<ExercisesDependency> ExerciseDependencyTargetExercises { get; set; }

    public virtual ICollection<UserExercise> UserExercises { get; set; }
}

public class UserExercise
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

    public long UserId { get; set; }

    public long ExerciseId { get; set; }
}

public class ExercisesDependency
{
    public long ExerciseId { get; set; }
    public virtual Exercise Exercise { get; set; }

    public long TargetExerciseId { get; set; }
    public virtual Exercise TargetExercise { get; set; }
}

【问题讨论】:

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


    【解决方案1】:

    我能想到的最简单的解决方案是不要让您的要求决定主键值(应该只用于唯一标识一条记录)。

    我不知道/理解您为什么有这个要求。但我建议继续编号,并在创建新记录时计算它是否应该是类型 1、2 或 3 的练习。例如1=>1, 2=>2, 3=>3, 4=>1, 5=>2, 6=>3, 7=>1。

    然后一个简单的:var type = ((id - 1) %3) + 1;返回该数字列表。

    【讨论】:

    • 对不起,我不明白````没有你的要求决定主键值````。 ExericesDependency 是多对多表(EF Core 创建 M2M 关系的方式)
    • 好吧,我想我们互相误解了,特别是在你的描述中使用了“完成”这个词。我理解你的问题是......我需要进行设置,以便当用户完成练习 1 时,即将练习 1 标记为已完成,然后需要创建一个 ID 为 2 的新练习。如果这不是你想要的'正在尝试做,那么也许您可以详细说明完成练习的含义?
    • 也许我的例子很糟糕。我更新了整个问题以模拟问题。抱歉解释不好
    猜你喜欢
    • 2016-08-01
    • 2021-01-16
    • 2018-03-03
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多