2017-04-17 8 views
0

私はasp net webプロジェクトを持っています。私はベースに複数のレコードを挿入しようとしています。
私のアイデアは、レコードを更新し、更新されたパラメータでこのレコードのコピーを作成することです。
しかし、私のレコードの更新のみ、私は(私はforeachを作成し、1レコードで挿入/更新したくない)挿入を行う方法を理解していません。
このレコードのコピーを1つの変更されたパラメータに挿入した後、どのように更新することができますか?エンティティフレームワークとlinqで多重アイテムを挿入する方法

マイコード:

public void SAVE(List<int> list,int stat) 
     { 
      var all = context.ReqForDoc.ToList(); 
      var friends = context.ReqForDoc.Where(f => list.Contains(f.requestN)).ToList(); 

      friends.ForEach(a => // UPDATE WORK 
      { 
       a.actual = 0; 
       a.ReqStatus = stat; 
       a.ChangeDate = DateTime.Now; 
      }); 

      all.AddRange(friends); // INSERT NOW WORK 

      context.SaveChanges(); 
     } 
+2

EF変更トラッカーは参照平等を使用します。したがって、元のオブジェクトを手動でコピー/更新して**新しい**オブジェクトを作成し、現在のようにローカルリスト*ではなく、対応する 'DbSet'に追加する必要があります。 –

+0

@IvanStoev申し訳ありませんが、私はどのように私のDBに追加することができます、この場合も動作しないAddrange: リスト list2 =新しいリスト(); list2 = context.ReqForDoc.Where(f => list.Contains(f.requestN))。ToList(); context.ReqForDoc.AddRange(list2); context.SaveChanges(); –

+0

私はあなたのモデルを持っていないので、私は正確には分かりませんが、このようなものでなければなりません(コメントの**新しい**部分を見逃したようです) 'context.ReqForDoc.AddRange(friends.Select( f =>新しいReqForDocType {Prop1 = f.Prop1、Prop2 = f.Prop2、...})) '。それがIDであれば、選択にPKを含めないでください。 –

答えて

0

私は解決策を見つけました。ソリューションのために@ Ivan Stoevに感謝します。新しいオブジェクトを作成し、新しい行を挿入するためにAddRangeを使用します。

public void SAVE(List<int> list) 

     { 
var all = context.ReqForDoc.ToList(); 
       var friends = context.ReqForDoc.Where(f => list.Contains(f.requestN)).ToList(); 
       friends.ForEach(a => 
       { 
        a.actual = 0; 
       }); 

       context.SaveChanges(); // UPDATE RECORDS 

       List<ReqInf> list2 = new List<ReqInf>(); 
       list2 = context.ReqForDoc.Where(f => list.Contains(f.requestN)).ToList(); 
       context.ReqForDoc.AddRange(list2); //INSERT NEW 
       list2.ForEach(a => 
       { 
        a.actual = 1; 
        if (a.Status == 3) { a.Status = 92; } 



       }); //UPDATE INSERTED 
       context.SaveChanges(); } 
関連する問題