using (var db = new MyDbContext())
{
var items = db.StockItems.ToList();
foreach (var item in items)
{
if (item.CurrentQuantity < item.MinQuantity)
{
db.Alerts.Add(new Alert {StockItem = item,
Message = "Low Quantity"});
db.SaveChanges();
}
}
}
В этом случае вам не нужно делать прикрепление. EF может отслеживать изменения только в своем собственном жизненном цикле, в первом случае, когда вы это делаете,
using (var db = new MyDbContext())
{
return db.StockItems.ToList();
}
Вы утилизируете MyDbContext, поэтому EF делает все стандартные элементы как независимые (отдельные элементы), и когда вы добавляете их в другой контекст, контекст предполагает, что это новый элемент, и он вставит его.
Лучшим способом будет сохранение контекста во всех изменениях, которые вы хотите внести. Также обратите внимание, что поддержание контекста в течение более длительного времени не означает, что вы будете постоянно поддерживать соединение с базой данных. EF автоматически открывает и закрывает соединение с базой данных, только когда вы выполняете запрос и вызываете изменения сохранения.
В противном случае вы должны присоединиться, как предложил Бен.