我有三个类,Fish(分别包含 Chips 和 MushyPeas 类型的两个属性)、MushyPeas(包含 Chips 类型的属性)和 Chips(具有 Name 属性)。
我正在运行以下假设代码:
int chipsId;
using (var db = new FishContext())
{
var creationChips = new Chips() { Name = "A portion of chips" };
db.Chips.Add(creationChips);
db.SaveChanges();
chipsId = creationChips.ChipsId;
}
Chips retrievedChips1;
using (var db = new FishContext())
{
retrievedChips1 = db.Chips.Where(x => x.ChipsId == chipsId).ToList()[0];
}
Chips retrievedChips2;
using (var db = new FishContext())
{
retrievedChips2 = db.Chips.Where(x => x.ChipsId == chipsId).ToList()[0];
}
using (var db = new FishContext())
{
db.Chips.Attach(retrievedChips1);
db.Chips.Attach(retrievedChips2);
var mushyPeas = new MushyPeas() { Chips = retrievedChips2 };
var fish = new Fish() { Chips = retrievedChips1, MushyPeas = mushyPeas };
db.Fish.Add(fish);
db.ChangeTracker.DetectChanges();
db.SaveChanges();
}
这是在我的真实应用程序中模拟一种情况,其中 EF 对象(实际上可能表示相同的数据库记录)从各种不同的 DbContext 加载,然后添加到另一个 DbContext 中的对象树中。
如果我不调用这两条 db.Chips.Attach 行,那么在将 Fish 对象保存到数据库并分配新 ID 时会创建全新的 Chips 实体。
调用 db.Chips.Attach 解决了检索到的对象之一的此问题,但第二次 Attach 调用失败,并出现异常“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”
在这里实现我想要实现的目标的最佳方法是什么?