Я пытаюсь определить предпочтительный метод сохранения изменений в списке. Я могу добавить список и сохранить изменения, но, если я сначала явно не удаляю все элементы списка из базы данных, я не могу сохранить обновленный список, поскольку Entity пытается добавить его независимо от существующих элементов, что приводит к нарушению первичного ключа.
List<Task> tasks = (The list of tasks I want to save);
MainJob job = db.Jobs.SingleOrDefault(j => j.jobId == jobId);
job.task = tasks;
db.SaveChanges();
Моя модель выглядит так
public class MainJob
{
public int jobId { get; set; }
[ForeignKey("jobId")]
public List<Task> task { get; set; }
}
public class Task
{
[Key, Column(Order = 1)]
[JsonIgnore]
[Required]
public int contractId { get; set; }
[Key, Column(Order = 2)]
public int taskId { get; set; }
}





Все, что вам нужно сделать, это написать только одну строчку кода.
List<Task> tasks = (The list of tasks I want to save);
MainJob job = db.Jobs.SingleOrDefault(j => j.jobId == jobId);
job.task = tasks;
//That is what you have missed
db.Update(job);
db.SaveChanges();
Вам необходимо сообщить EF обо всех сохраненных задачах. Обычно это можно сделать, посмотрев на идентификатор. например
List<Task> tasks = (The list of tasks I want to save);
MainJob job = db.Jobs.SingleOrDefault(j => j.jobId == jobId);
job.task = tasks;
foreach (var task in tasks)
{
if (task.contractId != 0) // New task
{
db.Tasks.Attach(task);
db.Entry(task).State = EntityState.Modified; // If modified
// otherwise can set it to Unchanged
// db.Entry(task).State = EntityState.Unchanged;
}
}
db.SaveChanges();
Конечно, если какие-либо задачи были удалены, вам нужно прикрепить их и пометить как EntityState.Deleted, иначе все, что уже есть в базе данных, останется там.
Другой вариант - удалить все для вашей работы из таблицы Task.
У меня нет метода обновления.