2016-10-18 4 views
0

AutoMapperは現在、Serverオブジェクト内のIpAddressオブジェクトをプルダウンしていません。最終目標は、編集ビューの現在のIPアドレスで既に入力されている入力を持っていることです。しかし、コントローラにブレークポイントを置くと、IpAddressプロパティはnullになりますので、実際のアドレスを取得できません。私はAutoMapperで間違ったことをしていますが、まだ特定のチュートリアルを見つけることができませんでした。前もって感謝します!オブジェクト内のオブジェクトをマッピングしていないAutoMapper

Break point screenie

ServersController.cs

public async Task<IActionResult> Edit(int? id) 
{ 
    if (id == null) 
    { 
     return NotFound(); 
    } 

    var server = Mapper.Map<ServerViewModel>(await _context.Servers.SingleOrDefaultAsync(m => m.Id == id)); 
    if (server == null) 
    { 
     return NotFound(); 
    } 
    return View(server); 
} 

ServerViewModel.cs

public class ServerViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public OperatingSystem OS { get; set; } 
    public MachineType MachineType { get; set; } 
    public string AdminUserName { get; set; } 
    public string AdminPassword { get; set; } 
    public string EsxHost { get; set; } 
    public int IpAddressId { get; set; } 
    public IpAddress IpAddress { get; set; } 

    public List<SelectListItem> GetOperatingSystems() 
    { 
     List<SelectListItem> operatingSystems = new List<SelectListItem>(); 
     Array values = Enum.GetValues(typeof(OperatingSystem)); 
     operatingSystems.Add(new SelectListItem 
     { 
      Text = "Select", 
      Value = "" 
     }); 

     foreach(OperatingSystem val in values) 
     { 
      operatingSystems.Add(new SelectListItem 
      { 
       Text = val.ToString(), 
       Value = val.ToString() 
      }); 
     } 
     return operatingSystems; 
    } 

    public List<SelectListItem> GetMachineTypes() 
    { 
     List<SelectListItem> machineTypes = new List<SelectListItem>(); 
     Array values = Enum.GetValues(typeof(MachineType)); 
     machineTypes.Add(new SelectListItem 
     { 
      Text = "Select", 
      Value = "" 
     }); 

     foreach (MachineType val in values) 
     { 
      machineTypes.Add(new SelectListItem 
      { 
       Text = val.ToString(), 
       Value = val.ToString() 
      }); 
     } 
     return machineTypes; 
    } 
} 

Server.cs

public class Server 
{ 
    [Key] 
    [Required] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public OperatingSystem OS { get; set; } 
    [Display(Name = "Machine Type")] 
    public MachineType MachineType { get; set; } 
    [Display(Name = "Admin User Name")] 
    public string AdminUserName { get; set; } 
    [Display(Name = "Admin Password")] 
    public string AdminPassword { get; set; } 
    [Display(Name = "ESX Host")] 
    public string EsxHost { get; set; } 
    public int IpAddressId { get; set; } 
    [ForeignKey("IpAddressId")] 
    public IpAddress IpAddress { get; set; } 
} 

Startup.cs

Mapper.Initialize(config => 
    { 
     config.CreateMap<IpAddressViewModel, IpAddress>().ReverseMap(); 
     config.CreateMap<ServerViewModel, Server>().ReverseMap(); 
    }); 

編集:いくつかの読みになった後、私は私がIpAddressオブジェクトに持ち込むために私のクエリに.Include()句を追加できることを発見しました。私の新しいServersController.csコードは以下の通りです。しかし、私はまだ少し混乱しています。 Automapperが自動的に処理することを意図したものではありませんか?私はAutomapperの全体のポイントを逃していますか?

NEW ServersController.cs

public async Task<IActionResult> Edit(int? id) 
{ 
    if (id == null) 
    { 
     return NotFound(); 
    } 

    var server = Mapper.Map<ServerViewModel>(await _context.Servers.Include(s => s.IpAddress).SingleOrDefaultAsync(m => m.Id == id)); 

    if (server == null) 
    { 
     return NotFound(); 
    } 
    return View(server); 
} 
+0

'_context.Servers.SingleOrDefaultAsync(m => m.Id == id).IpAddress'がnullであるかどうかチェックしましたか? – CSharper

+0

マッピングを表示して、サーバー上でIpAddressがnullでないことを確認してください。 – Rabban

+0

@Cこれは実際にはnullです。これは私が何か他のことを間違っていると思うようにする。私は、Entity Frameworkが 'IpAddressId'に基づいて' IpAddress'オブジェクトを取得するという印象を受けました。私が間違っている? –

答えて

0

私は先に行くと、その上にいくつかの閉鎖を置くためにこれを答えるつもりです。

キーは、親オブジェクトに添付されたオブジェクトをプルするLINQクエリに.Include()句を追加していました。

これを行う正しい方法は、上の私の編集のセクションです。さらなる例は、hereで見つけることができる。

関連する問題