2011-06-24 10 views
0

AutoMapperのメソッドBeforeMapおよびAfterMapには、ソースオブジェクトのコレクションを反復してこれらのマッピングメソッドは複数回実行されます。参照してください:Extra iterations in a foreach in an AutoMapper mapAutoMapper - Before/AfterMapを使用しないループ内の1つのEF4エンティティから別のEF4エンティティへのプロパティのマッピング

私がやっていることは少し複雑ですので、私に同行してください。

私は着信フォームデータに基づいて構築しようとしているEF4多対多グラフ(Games-to-Platforms)を持っています。グラフを作成するために、フォームから来た未加工の整数IDを取り出し、ゲームのコレクションに追加するために正しいプラットフォームをリポジトリから取得します。私は上記のリンクのBeforeMapの中で私の試みを見ることができます。

問題は、どのように進めるのかがわかりません。私はゲームへのプラットフォームを正常にAddにするために目的地(ゲーム)オブジェクトのホールドをつかむことができる必要があります。 ForMemberではこれが可能でしょうか?私が読んだところでは、カスタムリゾルバが私のために働くようには見えません。すべての可動部品(2つのエンティティ、リポジトリ)を指定してカスタムタイプコンバータを実装する方法がわかりません。

アイデアや提案はありますか?

答えて

0

私は単に自分のスタティックマッパーを作ることにしました。理想的なソリューションではなく、素晴らしいソリューションですが、機能します。それは間違いなく抽象化することができますが、私はAutoMapperが修正されるまでそれがバンドエイドであると判断します。私の解決策:

public static class GameMapper 
{ 
    public static Game Map(IGameRepository repo, AdminGameEditModel formData, Game newGame) 
    { 
     newGame.GameID = formData.GameID; 
     newGame.GameTitle = formData.GameTitle; 
     newGame.GenreID = formData.GenreID; 
     newGame.LastModified = DateTime.Now; 
     newGame.ReviewScore = (short)formData.ReviewScore; 
     newGame.ReviewText = formData.ReviewText; 
     newGame.Cons = String.Join("|", formData.Cons); 
     newGame.Pros = String.Join("|", formData.Pros); 
     newGame.Slug = formData.Slug; 

     if (newGame.Platforms != null && newGame.Platforms.Count > 0) 
     { 
      var oldPlats = newGame.Platforms.ToArray(); 

      foreach (var oldPlat in oldPlats) 
      { 
       newGame.Platforms.Remove(oldPlat); 
      } 
     } 

     foreach (var platId in formData.PlatformIDs) 
     { 
      var plat = repo.GetPlatform(platId); 
      newGame.Platforms.Add(plat); 
     } 

     return newGame; 
    } 
} 

残念ながら、私は三番目のパラメータに更新する時に、既存のエンティティデータを上書きするために私の必要性に起因するoutパラメータをすることはできません。繰り返しますが、間違いなく良い解決策ではありませんが、それはうまくいきます。私はOOの神々が後で私を打つだろうと確信しています。

関連する問題