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

时间:2018-07-24 16:28:50

标签: c# entity-framework-6 entity

我正在尝试确定将更改保存到列表的首选方法。我可以添加列表并保存更改,但是除非我首先从数据库中明确删除所有列表项,否则我将无法保存更新的列表,因为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; }
}

2 个答案:

答案 0 :(得分:1)

您需要将所有已保存的任务告诉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表中与您的工作相关的所有内容。

答案 1 :(得分:0)

您要做的就是只编写一行代码。

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();