我的超市模式包含StockItem类和含有StockItem领域的Alert类:实体框架的SaveChanges()在不同的DbContext插入不必要的行
public class StockItem
{
public int ID { get; set; }
public string Name { get; set; }
public int CurrentQuantity { get; set; }
public int MinQuantity { get; set; }
}
public class Alert
{
public int ID { get; set; }
public int Message{ get; set; }
public virtual StockItem StockItem { get; set; }
}
我有一个获取所有StockItems一个的DbContext功能:在一个又一个的DbContext
using (var db = new MyDbContext())
{
return db.StockItems.ToList();
}
以及处理这些物品的另一个功能,并增加新的警报:
foreach (var item in items)
{
if (item.CurrentQuantity < item.MinQuantity)
{
using (var db = new MyDbContext())
{
db.Alerts.Add(new Alert(){StockItem = item, Message = "Low Quantity"});
db.SaveChanges();
}
}
}
问题是:当保存警报时,一个新的股票项目(具有不同的ID)被添加到数据库,虽然它已经在那里! 任何解决方案?
我明白了。但现在我必须在db.SaveChanges()的许多情况下执行附加操作。根据StockItem的ID,Can not Entity Framework会自动知道它已经在数据库中了吗? – Sean 2011-05-24 08:24:10
如果你创建一个新的上下文,那么在不查询数据库的情况下ef无法知道它......所以,如果你不想重新连接,你应该改变上下文生命周期(不要在每次操作之后处理并缓存上下文) – benwasd 2011-05-24 08:31:02
@肖恩:没有EF不会为你做这样的事情。您有责任告知EF什么是新的,已更新,已删除或未更改。通过在警报上调用“添加”,您可以将所有实体附加到Alert的对象图中,并将它们标记为插入。 – 2011-05-24 09:21:58