2016-11-03 15 views
2

UserOrdersテーブルの間に親子関係があるアプリケーションで作業しています。下のテーブル構造は以下のとおりです。Entity Framework - 1回の変換での親子テーブル更新

ユーザー:

Column | DataType | Constraint 
--------|-----------|------------- 
UserId | int  | Primary key 
Username| varchar | 
Email | varchar | 
IsActive| bit  | 

注文:

Column | DataType | Constraint 
--------|-----------|---------- 
OrderId | int  | Primary key 
UserId | int  | Foreign key to User.UserId 
Type | smallint | 
Quantity| smallint | 

私はどこ注文ができるユーザーと一度で彼の命令を更新する必要がある機能を1として動的に追加、削除または更新することができます。

私はEntity Framework 6.0を使用していますが、親テーブル(user)と子テーブル(order)を単一トランザクションで更新するための最良の解決策が見つかりません。

このような機能を実現するための最良の方法を説明できる人はいますか?以下は

は、私が使用していますコードです:

注私は、エンティティ

public bool ManageUser(UserModel userDetails, string deletedOrders) 
{ 
    var isSuccess = false; 
    try 
    { 
     using (var entity = new UserEntity()) 
     { 
      if (userDetails.UserId == 0) 
      { 
       entity.Users.Add(Mapper.Map<User>(userDetails)); 
      } 
      else 
      { 
       var userToEdit = Mapper.Map<User>(userDetails); 

       foreach (var item in userToEdit.Orders) 
       { 
        if (item.OrderId == 0) 
        { 
         entity.Entry(item).State = System.Data.Entity.EntityState.Added; 
        } 
        else 
        { 
         entity.Entry(item).State = System.Data.Entity.EntityState.Modified; 
        } 
       } 

       /*** 
       * How to Write a code here to remove orders using deletedOrders parameter 
       * Note: deletedOrders contains comma separated Id of the orders which needs to be removed. e.g. "1,5,6" 
       ****/ 

       entity.Entry(userToEdit).State = System.Data.Entity.EntityState.Modified; 
      } 

      entity.SaveChanges(); 
      isSuccess = true; 
     } 

    } 
    catch (Exception ex) 
    { 

    } 

    return isSuccess; 
} 

にオブジェクトをマッピングするためにAutoMapperを使用しています注意してください:これは単純なコードです。しかし、もし私がOrderのような複数の子テーブルを持っていたらどうしますか?私がコードと同じ練習をするなら、複雑で扱いにくくなるでしょう。そのようなシナリオに最適なアプローチを探しています。

+1

は私たちに今のあなたが持っているコードを表示します! –

+0

@marc_s:コードを追加しました。私を混乱させる複数のコメントをご覧ください。 – user2988458

+0

SaveChangesを呼び出すと、コンテキスト内のすべての変更が、単一のトランザクション内でdbに書き込まれます。だからあなたは終わった。 –

答えて

1

削除する必要のあるエンティティのデータベースへの移動は必要ありません。

  1. userDetails.Ordersを削除すべき受注が含まれている場合は、それらの状態がSystem.Data.Entity.EntityState.Deletedにごforeach (var item in userToEdit.Orders)サイクルをinfを変更します。

  2. ない場合は、単純に、適したIDの持つものを作成して添付して、同様に彼らのEntityStateDeletedには変更:

    var ordersToDelete = deletedOrders.Split(new[] {','}, 
        StringSplitOptions.RemoveEmptyEntries).Select(x => new Order 
        { 
         Id = int.Parse(x.Trim()) 
        }) 
        .ToList(); 
    
    ordersToDelete.ForEach(o => 
        entity.Entry(x).State = System.Data.Entity.EntityState.Deleted); 
    
+0

#1の代わりに: 'orderId'が 'deletedOrders'に属しているかどうかをチェックし、' userToEdit.Orders '。しかしこの場合、 'foreach'を' for'ループに変更してください。 –

+0

私は#2に行きます。これはうまくいった – user2988458

+0

しかし、あなたはもっと多くの子テーブルのために何かを提案し、複雑さを減らすことができますか? – user2988458

関連する問題