【问题标题】:EF Core: Error moving an object from one collection to anotherEF Core:将对象从一个集合移动到另一个集合时出错
【发布时间】:2016-10-19 07:03:13
【问题描述】:

例如有以下类:

public class Detail
{
    public int Id { get; set; }
    public int MachineId { get;set; }
    public Machine Machine { get; set; }
}

public class Machine
{
    public int Id { get; set; }
    public ICollection<Detail> Details { get; set; }
}

这是一个当前状态:

  • 机器1
    • 详情1
  • 机器2
    • 细节2

我只想将 Detail2 从 Machine2 移动到 Machine1。 试试看:

var machine1 = myDbContext.Machines
    .Include(m => m.Details)
    .First(m => m.Id == 1);

var machine2 = myDbContext.Machines
    .Include(m => m.Details)
    .First(m => m.Id == 2);

var detail2 = machine2.Details.First(d => d.Id == 2); // It still works fine

machine2.Details.Remove(detail2);
machine1.Details.Add(detail2);

myDbContext.SaveChanges(); // Exception!

System.InvalidOperationException:无法跟踪实体类型“MyNamespace.Detail”的实例,因为已在跟踪具有相同键的此类型的另一个实例。对于新实体,请考虑使用 IIdentityGenerator 生成唯一键值。

这似乎是一个错误!

还是我做错了什么?

【问题讨论】:

  • 您更新了MachineId 上的detail2 吗?
  • 是的,我已经尝试过了,但没有成功。
  • 不工作,我用 EF core rc2 测试过你有哪个版本?
  • 是的,一定是一个错误。虽然在资源方面只修改细节的MachineId会更好。

标签: c# entity-framework asp.net-core-mvc entity-framework-core


【解决方案1】:

使用 Entity Framework Core 3.1.5 测试

一旦从集合中删除一个项目,它似乎总是被删除,即使添加到另一个项目(以任何顺序添加/删除或删除/添加)。

有效的方法是将项目添加到第二个集合中,但不将其从第一个集合中删除。 有趣的是,在调用 SaveChanges 之后,内存中的集合被更新:EF 从第一个集合中删除了该项目。

var machine1 = myDbContext.Machines
    .Include(m => m.Details)
    .First(m => m.Id == 1);

var machine2 = myDbContext.Machines
    .Include(m => m.Details)
    .First(m => m.Id == 2);

var detail2 = machine2.Details.First(d => d.Id == 2); // It still works fine

machine1.Details.Add(detail2);

myDbContext.SaveChanges();

Assert.Contains(detail2, machine1.Details);
Assert.DoesNotContain(detail2, machine2.Details);

然后您可以在数据库上检查外键是否已更改或检索新 DbContext 上的实体。

有趣的是,内存集合在SaveChanges 之后更新,如果事务正在包装此代码,您可以继续安全地使用已更新的内存实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多