繁体   English   中英

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

[英]EF Core 2 throws exception on SaveChanges, after first update for related entities

您好:)我遇到了在具有相关实体的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。

谢谢 :)

我认为您的模型不正确。 尝试这个:

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的关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM