AutoMapperは現在、Server
オブジェクト内のIpAddress
オブジェクトをプルダウンしていません。最終目標は、編集ビューの現在のIPアドレスで既に入力されている入力を持っていることです。しかし、コントローラにブレークポイントを置くと、IpAddress
プロパティはnullになりますので、実際のアドレスを取得できません。私はAutoMapperで間違ったことをしていますが、まだ特定のチュートリアルを見つけることができませんでした。前もって感謝します!オブジェクト内のオブジェクトをマッピングしていないAutoMapper
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);
}
'_context.Servers.SingleOrDefaultAsync(m => m.Id == id).IpAddress'がnullであるかどうかチェックしましたか? – CSharper
マッピングを表示して、サーバー上でIpAddressがnullでないことを確認してください。 – Rabban
@Cこれは実際にはnullです。これは私が何か他のことを間違っていると思うようにする。私は、Entity Frameworkが 'IpAddressId'に基づいて' IpAddress'オブジェクトを取得するという印象を受けました。私が間違っている? –