У меня есть три класса: 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 объекты (которые на самом деле может представлять собой ту же запись базы данных) будут загружены из множество различных DbContexts, а затем добавлено в дерево объектов в другом DbContext.
Если я не вызываю две строки db.Chips.Attach, тогда новые объекты Chips создаются, когда объект Fish сохраняется в базе данных и назначаются новые идентификаторы.
Вызов db.Chips.Attach разрешает эту проблему для одного из полученных объектов, но второй вызов Attach не выполняется с исключением: «Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с помощью тот же ключ. "
Каков наилучший способ достичь того, чего я хочу достичь здесь?
FYI, если вы используете только один DbContext для более длительного срока службы, нет никакого вреда, потому что DbContext не поддерживает соединение с БД все время, только для запросов и сохранения изменений он открывает и закрывает соединение с базой данных.Наличие множественного контекста просто увеличивает сложность. –