Cycli c проверка зависимостей с использованием EF Core - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующее требование при использовании EF Core 3. У меня есть упражнения с (Id = 1 Pushup), (Id = 2 приседания), (Id = 3 поднятия веса) и пользователями. По завершении одного упражнения создается еще одно или несколько новых упражнений. Многоуровневая иерархия может быть создана на уровне n. У меня есть проблема, которая может вызвать циклические зависимости c для упражнений. например, Pushup (1) завершен. Приседание (2) создано. Приседание (2) выполняется, после чего создается Подъем веса (3). Существует также зависимость от функции Weight Lift (3), которая после завершения создает Pushup (1), что приводит к зависимости cycli c, и мне нужно этого избегать. Я привел очень простой пример. В моем проекте зависимости могут go доходить до 50 уровня, и я не знаю, как проверить циклические ссылки c и избежать их. Ниже приведен код:

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; }
}

1 Ответ

0 голосов
/ 14 февраля 2020

Самое простое решение, которое я могу придумать, - это чтобы ваши требования не диктовали значения первичных ключей (которые должны использоваться только для однозначной идентификации записи).

Я не знаю / не понимаю, почему у вас есть это требование , Но я бы предложил просто продолжить нумерацию и при создании новых записей вычислить, должно ли это быть упражнение типа 1, 2 или 3. Например, 1 => 1, 2 => 2, 3 => 3, 4 => 1 , 5 => 2, 6 => 3, 7 => 1.

Тогда просто: var type = ((id - 1)% 3) + 1; возвращает этот список чисел.

...