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