用实体更新列表的正确方法是什么?

What Is the Correct Way to Update a List with 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。您通常可以通过查看 ID 来做到这一点。例如

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 table.

中您的工作的所有内容