【发布时间】:2018-07-30 03:12:39
【问题描述】:
我想做的是在 EF Core 中复制/复制我的 School 对象及其所有子/关联
我有类似以下的内容:
var item = await _db.School
.AsNoTracking()
.Include(x => x.Students)
.Include(x => x.Teachers)
.Include(x => x.StudentClasses)
.ThenInclude(x => x.Class)
.FirstOrDefaultAsync(x => x.Id == schoolId);
我一直在阅读有关深度克隆的信息,似乎我应该能够只添加实体...几乎是下一行。
await _db.AddAsync(item);
那么 EF 应该足够聪明,可以将该实体添加为新实体。但是,马上我得到一个冲突,说“id {schoolId} 已经存在”并且不会插入。即使我重置了我要添加的新项目的 ID,我仍然会与学校 iteam 的关联/孩子的 ID 发生冲突。
有没有人熟悉这个以及我可能做错了什么?
【问题讨论】:
-
从你的
item.Id == Guid.NewGuid()行你没有设置属性,你正在检查是否相等。我假设您实际上并没有在保存之前将属性设置为不同的值。显示更多您正在运行的代码,以便我们提供更好的帮助,但乍一看这似乎是问题所在。 -
对不起,我想做的只是克隆我的项目对象。我会尝试重新提出我的问题!
-
实际上这被认为是对 EF Core 2 的改进。即使您调用
Add,具有非默认 PK 的实体(例如 0、Guid.Empty等)也将被视为存在。恐怕“深度克隆”不是 EF Core 目标。见Disconnected Entities。 -
这就是我不希望听到的 :)
-
你可以用
TrackGraph的方法来模拟强制Add。在回调中,您必须将实体 PK 设置为default(Guid)并将状态设置为Added。
标签: entity-framework-core deep-copy ef-core-2.0