4

私のスーパーマーケット モデルには、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; }
}

1 つの DbContext ですべての StockItems をフェッチする関数があります。

using (var db = new MyDbContext())
{
     return db.StockItems.ToList();
}

これらのアイテムを処理し、別の 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();
        }
     }
}

問題は次のとおりです: アラートが保存されると、新しい在庫アイテム (別の ID を持つ) がデータベースに追加されますが、それは既に存在します! 解決策はありますか?

4

2 に答える 2

5

私はあなたがAttach最初に在庫品を持っているべきだと思います。これを試して:

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();
        }
     }
}
于 2011-05-24T08:16:42.357 に答える
0
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は、クエリを実行していて、変更の保存を呼び出している場合にのみ、データベース接続を自動的に開いたり閉じたりします。

それ以外の場合は、ベンが提案したように添付する必要があります。

于 2011-05-24T08:36:58.253 に答える