2016-11-16 19 views
0

内から保存私は現在、次のように構成されているデータベース内のテーブルを持っていますインターセプトし、リダイレクトエンティティのSaveChanges

OrderId | CustomerId | PartId | OrderDate | Quantity 
1  | 23   | 45  | 2016-11-16 | 1 
2  | 23   | 45  | 2016-11-16 | 1 
3  | 23   | 45  | 2016-11-16 | 1 
4  | 26   | 30  | 2016-10-25 | 1 
5  | 26   | 30  | 2016-10-25 | 1 

の代わりに::

OrderId | CustomerId | PartId | OrderDate | Quantity 
1  | 23   | 45  | 2016-11-16 | 3 
4  | 26   | 30  | 2016-10-25 | 2 
、PartId、および受注日、私たちは、データベースに次の多くのインスタンスを持っています

私は規制/ロギングの問題によりデータベースを更新する権限がありません。更新によりレガシーコードが破損する可能性があります。しかし私は上司に、Entityを更新して、前進するデータにこれらの制約を適用させるように説得しました。

私の考えはDbContextでレガシーコードが解除され、保存CustomerIdPartId、およびOrderDateが既に存在する別の行、および既存の行のQuantity列を追加しようとすると、その増加していることをSaveChangesをオーバーライドすることです。これまでのところ、私は次のことがありますが、保存をキャンセルし、既存の行を更新し、その行をSaveChangesから保存するように強制する方法がわかりません。

public override int SaveChanges() 
{ 

    var PartAssemblyList = ChangeTracker.Entries() 
          .Where(x => x.Entity is Order && 
             x.State == EntityState.Added); 

    foreach (var entity in PartAssemblyList) 
    { 
     if (/*RowExists*/) 
     { 
      //Cancel Save (entity.State = EntityState.Unchanged)? 
      //Update Quantity of Existing Row 
      //Set existing row to save 
     } 
    } 

    return base.SaveChanges(); 
} 
+0

これは、ビジネスロジックとして1つ上に実装する必要があるようなものです。どんなクラスが行を追加するためにコンテキストを使用していても、最初に行を探し、存在する場合はカウントを増やすように変更する必要があります。私はあなたがそのコードを変更することができないかもしれないが、私はちょうど言っていることを理解しています。 IMHO、あなたはSaveChangesの動作を無効にしようとするワームの缶を開いています。あなたはこれを行うことで何を得るのですか?それをそのままにしておくことの欠点は何ですか? (はっきりとは別に)。ストレージが問題でない場合、私はあなたの上司と一緒です。そのまま残す。 – JuanR

答えて

1

私はあなたがOrders以外の他のエンティティとそれを使用する可能性があるため、EFをオーバーライドすることは悪いアイデアだと思います。あなたはSaveChanges()コールをラップして自分で追加/更新の仕事をしてみませんか?

public void AddUpdateOrder(Order o) 
{ 
    using(var ctx = new YourDataModelContext()) 
    { 
     if(ctx.Orders.Any(x => x.OrderId == o.OrderId && x.CustomerId == o.CustomerId && x.PartId == o.PartId && x.OrderDate == o.OrderDate)) 
     { 
      var e = ctx.Orders.Where(x => x.OrderId == o.OrderId && x.CustomerId == o.CustomerId && x.PartId == o.PartId && x.OrderDate == o.OrderDate).FirstOrDefault(); 
      e.Quantity += 1; 
      ctx.Entry(e).State = Modified; 
     } 
     else 
     { 
      Order e = new Order() { OrderId = o.OrderId, CustomerId = o.CustomerId, PartId = o.PartId, OrderDate == o.OrderDate, Quantity = 1}; 
      ctx.Orders.Add(e); 
     } 
     ctx.SaveChanges(); 
    } 
} 
+0

ありがとうございます。私はSaveChangesを編集することで複雑になると思った。これが最善の方法です。 – coffeecop

関連する問題