在首次更新相关实体后,EF Core 2会在SaveChanges上抛出异常

时间:2018-02-28 11:27:59

标签: c# entity-framework-core ef-core-2.0

嗨:)我遇到了编辑/更新db中具有相关实体的条目的问题。我能够编辑任何一个条目,之后我无法更新任何具有相同主体实体的依赖实体,就像我已修改的实体一样

我花了最近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)之后,我再也无法使用与更新条目相同的工作更新任何条目。我在SaveChanges上得到例外,说已经跟踪了具有相同id的Worker 如果我转行workInDb.Worker = input.Worker然后保存,但这不是我需要的功能。
如果我打开v.1代码而不是v.2,我没有例外,但SaveChanges什么都不做 在两种情况下,修改条目的数量(在上下文中)为0。

thx:)

1 个答案:

答案 0 :(得分:1)

我不认为你的模型是对的。 试试这个:

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的新Worker,而是添加与现有worker的关系。