2014-02-28 92 views
2

我在我的ASP.NET MVC4項目中使用AutoMapper。映射2類Question和QuestionViewModel時遇到問題。在這裏我的兩個模型類:AutoMapper:映射元組到元組

public class Question 
    { 
     public int Id { get; set; } 
     public string Content { get; set; } 
     public Tuple<int, int> GetVoteTuple() 
     { 
     "some code here" 
     } 
    } 

    public class QuestionViewModel 
    { 
     public int Id { get; set; } 
     public string Content { get; set; } 
     public Tuple<int, int> VoteTuple { get; set; } 
    } 

這裏是我的控制器代碼:

public class QuestionController: Controller 
    { 
     public ActionResult Index(int id) 
     { 

      Question question = Dal.getQuestion(id); 
      Mapper.CreateMap<Question, QuestionViewModel>() 
       .ForMember(p => p.VoteTuple, 
       m => m.MapFrom(
       s => s.GetVoteTuple() 
      )); 

      QuestionViewModel questionViewModel = 
         Mapper.Map<Question, QuestionViewModel>(question); 

      return View(questionViewModel); 

      } 
    } 

當我運行這段代碼QuestionViewModelVoteTuple酒店空值。我如何映射2類與Tuple屬性?

謝謝。

+0

您正在使用什麼版本?此外,MapFrom片不是必需的,AutoMapper會自動映射GetFoo() - > Foo(不帶Get的方法稱爲Get屬性)。 –

回答

1

映射到元組是不可能在默認情況下,由於元組沒有setter屬性(他們只能通過構造函數初始化)。

你有2種選擇:

1)創建Automapper自定義解析,然後使用.ResolveUsing方法在映射配置:.ForMember(p => p.VoteTuple, m => m.ResolveUsing<CustomTupleResolver>())

2)映射到一個屬性/一類,而不是像這樣的:

public class QuestionViewModel 
{ 
    public int Id { get; set; } 
    public string Content { get; set; } 
    public int VoteItem1 { get; set; } 
    public int VoteItem2 { get; set; } 
} 

然後:

.ForMember(p => p.VoteItem1, m => m.MapFrom(g => g.Item1)) 
.ForMember(p => p.VoteItem2, m => m.MapFrom(g => g.Item2)) 

你並不需要在你的視圖模型中使用Tuple,所以我會推薦第二個選項。

編輯

我看你已經更新了你的代碼,以便GetVoteTuple()是一個函數,而不是一個屬性。在這種情況下,你可以輕鬆地適應這樣的代碼:

.ForMember(p => p.VoteItem1, m => m.MapFrom(g => g.GetVoteTuple().Item1)) 
.ForMember(p => p.VoteItem2, m => m.MapFrom(g => g.GetVoteTuple().Item2)) 
1

CreateMap調用是不正確的:

Mapper.CreateMap<Question, QuestionViewModel>() 
    .ForMember(p => p.VoteTuple, 
     m => m.MapFrom(
     s => s.GetVoteTuple() 
//-----------^ 
    )); 
+0

謝謝你安德魯,我改變'問題' - >'s'但它仍然有空值。 –

+0

@ user3286476:你可以顯示'GetVoteTuple()'的實現嗎? –

0

嘗試使用ResolveUsing代替MapFrom(和你的拉姆達使用通用s參數,而不是局部變量的引用的:

 Mapper.CreateMap<Question, QuestionViewModel>() 
      .ForMember(p => p.VoteTuple, 
      m => m.ResolveUsing(
      s => s.GetVoteTuple() 
     )); 

MapFrom使用直接映射屬性由於您想從函數調用的結果中「映射」,因此ResolveFrom更多適當的。

此外,你應該只在您的應用程序通過Automapper調用CreateMap一次,通常是在Application_Start完成從元組global.asax

0

試試這個:

Mapper.CreateMap<Question, QuestionViewModel>() 
       .ForMember(p => p.VoteTuple,op=>op.MapFrom(v=>new Tuple<int,int>(v.GetVoteTuple.Item1,v.GetVoteTuple.Item2)));