用实体更新列表的正确方法是什么?
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.
中您的工作的所有内容
我正在尝试确定将更改保存到列表的首选方法。我可以添加列表并保存更改,但除非我首先明确地从数据库中删除所有列表项,否则我无法保存更新后的列表,因为无论现有项目如何,实体都会尝试添加它,从而导致主键冲突。
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.