实体框架SaveChanges()在不同的DbContext中插入不必要的行

Sea*_*ean 4 entity entity-framework savechanges

我的超市模型包含一个StockItem类和一个包含StockItem字段的Alert类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个函数,用一个DbContext获取所有StockItems:

using (var db = new MyDbContext())
{
     return db.StockItems.ToList();
}
Run Code Online (Sandbox Code Playgroud)

另一个处理这些项目的函数,以及在另一个DbContext中添加新的警报:

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();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

问题是:当保存警报时,新的库存项目(具有不同的ID)将添加到数据库中,尽管它已经存在!任何解决方案

ben*_*asd 5

我认为你应该Attach首先使用stockitem.试试这个:

foreach (var item in items)
{
     if (item.CurrentQuantity < item.MinQuantity)
     {
        using (var db = new MyDbContext())
        {
            db.StockItems.Attach(item);
            db.Alerts.Add(new Alert {StockItem = item, Message = "Low Quantity"});
            db.SaveChanges();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)