Добро пожаловать в StackOverflow!
Насколько я знаю, EF не может обрабатывать отношения такого рода.
Ваша проблема не в том, что основной ключ не является первичным ключом.Ваша основная проблема заключается в том, что эти ключи (TaskType
s) не являются уникальными .
Предложение решения
Вы можете обойти это ограничение, инкапсулировав логику загрузкизависимые задачи в хранилище.Хотя многие люди советуют против построения шаблона хранилища поверх EF, и в большинстве случаев я тоже на этой стороне, это отличный пример того, почему он может быть полезен.
Я бы создал метод, который заполняет зависимости, используя LINQ, может быть, метод расширения, что-то вроде:
private static void LoadDependentTasks(this Task task, IEnumerable<Task> allTasks){
task.Dependencies = allTasks.Where(yourCustomSelector).ToList();
}
Затем в вашем хранилище вы можете использовать этот метод в задачах, которые вы загрузили, прежде чем вернуть их,Например:
public Task GetById(Guid taskId){
Task t = _context.Tasks.Find(taskId);
t.LoadDependentTasks(_context.Tasks);
}
Затем, когда ваша бизнес-логика вызывает ваш репозиторий, он получит объекты, у которых уже заполнено свойство Dependencies
.
Есть одна оптимизация это стоит упомянуть здесь, хотя.Это не так важно для получения одной задачи, но имеет большое значение при загрузке их всех.Если вы наивно реализуете метод GetAll, как показано ниже, будет извлекать список задач с сервера n х , что не очень хорошо.
public Task GetAll(){
List<Task> allTasks = _context.Tasks.ToList();
foreach(var task in allTasks)
task.LoadDependentTasks(_context.Tasks);
return allTasks;
}
Вместо этого вы должны передать уже существующую переменную allTasks
в метод.Если - в другом сценарии - у вас нет списка задач, другое решение - вызвать _context.Tasks.Load()
и затем использовать _context.Tasks.Load
.