【问题标题】:What Is the Correct Way to Update a List with Entity?用实体更新列表的正确方法是什么?
【发布时间】:2018-07-24 16:28:50
【问题描述】:

我正在尝试确定将更改保存到列表的首选方法。我可以添加列表并保存更改,但除非我首先从数据库中明确删除所有列表项,否则我无法保存更新的列表,因为实体尝试添加它而不考虑现有项,从而导致主键冲突。

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; }
}

【问题讨论】:

    标签: c# entity-framework-6 entity


    【解决方案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 表中您的工作的所有内容。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我没有更新方法。
      猜你喜欢
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多