【问题标题】:EF Core 2 throws exception on SaveChanges, after first update for related entities第一次更新相关实体后,EF Core 2 在 SaveChanges 上引发异常
【发布时间】:2018-03-14 02:06:23
【问题描述】:

嗨 :) 我在编辑/更新具有相关实体的 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。

谢谢 :)

【问题讨论】:

  • 你不必做 _context.Add(workInDb);在你做 SaveChanges 之前?
  • 并非如此。他在相同的上下文中进行更新,因此 SaveChanges 将“足以”持久化更改。
  • 我之前已经尝试过,但无论我使用了什么添加、更新、条目、附加,它都会在 SaveChanges 之前对这些方法抛出异常。如果没有这些,它会在 SaveChanges 上抛出

标签: c# entity-framework-core ef-core-2.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; }
}

而不是设置工作人员,而是像这样设置其 Id:

 workInDb.WorkerId = input.Worker.Id;

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

【讨论】:

  • 我用字符串而不是 int 尝试过这个,因为 Worker 派生自 UserIdentity。现在它抛出一个异常,说“UPDATE 语句与 FOREIGN KEY 约束 \"FK_WorkList_Worker_WorkerId\" 冲突。冲突发生在数据库 \"WorkRecords\"、表 \"dbo.Worker\"、列 'Id' 中。\r\ n 声明已终止。”在此更改之前,我能够进行一次更新,现在它在第一次更新请求时抛出错误
  • 您确定您在 Work 上设置的 Worker.Id 实际上是正确的值吗?当数据库中没有具有该 ID 的 Worker 时,可能会发生该错误。
  • 就是这样。非常感谢兄弟:) 我有一个不同的数据库,用于存储注册用户和另一个用于应用程序数据的数据库。我正在从用户数据库导入workerid,然后将其写入应用程序数据数据库的工作表中。非常感谢 :)
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多