Код: Выделить всё
public class TaskFlowTemplate
{
public int Id { get; set; } // This is found on every class
[NotMapped]
public Guid Guid { get; set; } = Guid.NewGuid(); // Maybe need this to link som data in memory before we got Id from DB, this one is on every one
// ...
public ICollection Tasks { get; set; }
}
public class TaskEntity
{
.......
// one-to-one relation if TaskEntity is an activity
public int? ActivityEntityId { get; set; }
public ActivityEntity Activity { get; set; }
}
public class ActivityEntity
{
....
public ICollection Dependencies { get; set; }
public TaskEntity Task { get; set; } // Backref.
}
public class ActivityDependency
{
...
public int ActivityId { get; set; }
public ActivityEntity Activity { get; set; }
public int PredecessorId { get; set; }
public ActivityEntity Predecessor { get; set; }
[NotMapped]
public Guid PredecessorGuid { get; set; } // use when link in memory
}
< /code>
Я получаю свои данные, как это, и выполняю сглаженные задачи: < /p>
using var db = _dbContextFactory.CreateDbContext();
return await db.TaskFlowTemplates
.Include(t => t.Tasks)
.ThenInclude(te => te.Activity)
.ThenInclude(a => a.Dependencies)
.Include(t => t.Tasks)
.ThenInclude(te => te.Supplier)
.FirstOrDefaultAsync(t => t.Id == id);
< /code>
Я изменяю задачи, чтобы быть похожими на модель дерева вместо локально, потому что у меня будет возможность создавать и связывать родительские /дочерние задачи без необходимости сохранять каждый раз. < /p>
public List BuildTaskTree(List flatTasks)
{
// Indexera alla tasks på Id (eller Guid om du kör med det internt)
var taskLookup = flatTasks.ToDictionary(t => t.Id);
foreach (var task in flatTasks)
{
if (task.ParentTaskEntityId.HasValue && taskLookup.TryGetValue(task.ParentTaskEntityId.Value, out var parent))
{
parent.ChildTasks ??= new List();
parent.ChildTasks.Add(task);
}
}
// Rotnoder = de utan parent
return flatTasks.Where(t => !t.ParentTaskEntityId.HasValue).ToList();
}
Это работает в памяти, как и должно. Структура данных кажется в порядке при отправке на мой метод обновления. Я ищу и использую модели GPT, но застрял. Я предполагаю, что моя самая большая проблема заключается в том, что ActivityDependency .
Есть ли кто-то, кто может указать мне на правильное направление для обработки такого случая сохранения/обновления?
Код: Выделить всё
public async Task UpdateTaskFlowTemplate(TaskFlowTemplate taskFlowTemplate)
{
using var db = _dbContextFactory.CreateDbContext();
var existing = await db.TaskFlowTemplates
.Include(t => t.Tasks)
.ThenInclude(te => te.Activity)
.ThenInclude(a => a.Dependencies)
.Include(t => t.Tasks)
.ThenInclude(te => te.Supplier)
.FirstOrDefaultAsync(t => t.Id == taskFlowTemplate.Id);
db.Entry(existing).CurrentValues.SetValues(taskFlowTemplate);
Подробнее здесь: https://stackoverflow.com/questions/797 ... ee-of-data
Мобильная версия