第一次更新相关实体后,EF Core 2 在 SaveChanges 上抛出异常
EF Core 2 throws exception on SaveChanges, after first update for related entities
你好 :) 我 运行 遇到了数据库中具有相关实体的 editing/updating 条目的问题。我可以编辑任何条目一次,之后我无法更新任何具有相同主体实体的依赖实体,作为我已经修改的实体
我花了大约 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;
}
对于给定的工作人员,我只能对工作条目进行一次更新。
在我 edit/update 一个工作条目(savedEntries 的值为 2)之后,我无法再更新与更新条目相同的工作人员的任何条目。我在 SaveChanges 上遇到异常,说已经跟踪了具有相同 ID 的工作人员。
如果我打开 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; }
}
而不是设置工作人员,而是像这样设置其 Id:
workInDb.WorkerId = input.Worker.Id;
这将阻止 EF 尝试创建和存储具有相同 ID 的新 Worker,而是添加与现有 worker 的关系。
你好 :) 我 运行 遇到了数据库中具有相关实体的 editing/updating 条目的问题。我可以编辑任何条目一次,之后我无法更新任何具有相同主体实体的依赖实体,作为我已经修改的实体
我花了大约 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;
}
对于给定的工作人员,我只能对工作条目进行一次更新。
在我 edit/update 一个工作条目(savedEntries 的值为 2)之后,我无法再更新与更新条目相同的工作人员的任何条目。我在 SaveChanges 上遇到异常,说已经跟踪了具有相同 ID 的工作人员。
如果我打开 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; }
}
而不是设置工作人员,而是像这样设置其 Id:
workInDb.WorkerId = input.Worker.Id;
这将阻止 EF 尝试创建和存储具有相同 ID 的新 Worker,而是添加与现有 worker 的关系。