代码之家  ›  专栏  ›  技术社区  ›  llessurt

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

  •  0
  • llessurt  · 技术社区  · 8 年前

    我正在尝试确定保存列表更改的首选方法。我可以添加列表并保存更改,但除非首先从数据库中显式删除所有列表项,否则无法将更新的列表保存为实体尝试添加列表,而不管现有项目如何,都会导致主键冲突。

    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 回复  |  直到 8 年前
        1
  •  1
  •   Michal Ciechan    8 年前

    您需要告诉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 表。

        2
  •  0
  •   Tony Troeff    8 年前

    你所要做的就是只写一行代码。

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