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

EF Core 2在对相关实体进行第一次更新后,在SaveChanges上引发异常

  •  0
  • nedimbih  · 技术社区  · 6 年前

    您好:)我在编辑/更新具有相关实体的数据库中的条目时遇到问题。我可以编辑任何条目一次,之后我无法更新与我已修改的实体具有相同主体实体的任何从属实体

    我花了5天左右的时间,试图解决这个问题。我在网上找到的所有建议都无效:(

    您可以看到项目@: https://github.com/nedimbih/WorkNotes
    问题在于:

    public partial class Work
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
    
    
        public virtual Worker Worker { get; set; }
    
        public DateTime Date { get; set; }
        public TimeSpan StartingTime { get; set; }
        public float Duration { get; set; }
        public string Note { get; set; }
    }
    

    public partial class Worker : IdentityUser
    {
    
        public Worker() => WorksDoneByWorker = new HashSet<Work>();
    
    
        public virtual  ICollection<Work> WorksDoneByWorker { get; set; }
    }
    

    在WorkRepository中。cs我有这个密码

     internal int Update(Work input)
        {
    
            Work workInDb = _context.WorkList
                                    .Include(w => w.Worker)
                                    .FirstOrDefault(w => w.Id == input.Id);
    
            if (workInDb != null)
            // v.1
            // {workInDb = input;}
            // v.2
            {
                workInDb.Note = input.Note;
                workInDb.StartingTime = input.StartingTime;
                workInDb.Duration = input.Duration;
                workInDb.Date = input.Date;
                workInDb.Worker = input.Worker;
            }
            int savedEntries;
            try
            {
                savedEntries = _context.SaveChanges();
            }
            catch (Exception)
            {
                savedEntries = 0;
                // used as a flag. Calling code acts upon it
            }
            return savedEntries;
        }
    

    对于给定的工作人员,我只能更新一次工作条目。
    编辑/更新一个工作条目(savedEntries的值为2)后,我无法再使用与已更新条目相同的worker更新任何条目。我在SaveChanges上遇到异常,称已在跟踪具有相同id的工作人员。
    如果我转线工作B。工作者=输入。然后,它会保存,但这不是我需要的功能。
    如果启用v.1代码而不是v.2代码,则不会出现异常,但SaveChanges不会执行任何操作。
    在这两种情况下(上下文中)修改的条目计数均为0。

    thx:)

    1 回复  |  直到 6 年前
        1
  •  1
  •   joaoruimartins    6 年前

    我认为你的模型不对。 尝试以下操作:

    public partial class Work
    {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    
    public int WorkerId { get; set; }
    public Worker Worker { get; set; }
    
    public DateTime Date { get; set; }
    public TimeSpan StartingTime { get; set; }
    public float Duration { get; set; }
    public string Note { get; set; }
    }
    

    而不是设置worker,而是将其Id设置为:

     workInDb.WorkerId = input.Worker.Id;
    

    这将阻止EF尝试创建和存储具有相同Id的新工作线程,而是向现有工作线程添加关系。