Отображение частичного объекта на объект назначения с помощью AutoMapper - PullRequest
0 голосов
/ 14 января 2020

У меня есть этот класс модели

  public class AppInfo
  {
    [Required(ErrorMessage = "Campo obrigatório")]
    public string nick { get; set; }
    [Required(ErrorMessage = "Campo obrigatório")]
    public string version { get; set; }
    public string description { get; set; }
    public bool invalidated { get; set; }
    public System.DateTime releasedAt { get; set; }
    public System.DateTime createdAt { get; set; }
    public System.DateTime updatedAt { get; set; }
  }

, и у меня есть запрос пут, который может получить три поля вышеуказанной модели

  public class AppInfoPutModel
  {
    public string description { get; set; }
    public bool invalidated { get; set; }
    public System.DateTime releasedAt { get; set; }
  }

и когда я получу частичную информацию в теле запрос, мне нужно отобразить эту новую информацию
внутри назначения объекта с помощью AutoMapper или что-то подобное, и я попытался сделать это

    AppInfo appInfo = await_getAppInfoByNickAndVersionBll.GetAppInfoByNickAndVersion(appNick, appVersion);

    new MapperConfiguration(cfg => cfg.CreateMap<AppInfoPutModel, AppInfo>());

    _mapper.ConfigurationProvider.CreateMapper();

    _mapper.Map(appInfoToUpdate, appInfo);

    await _putAppInfoBll.PutAppInfo(appInfo, appInfoToUpdate);

    return new OkObjectResult(appInfo);

, и этот код выдает ошибку, потому что AppInfoPutModel не имеет все свойства, которые имеет AppInfo, и не могут отобразить все поля, есть ли способ сопоставить только эти 3 поля и сохранить другие поля?

1 Ответ

0 голосов
/ 15 января 2020

Похоже, вы забыли передать фактический результат отображения. Эта строка:

_mapper.Map(appInfoToUpdate, appInfo);

Возвращает результат сопоставления исходного объекта с существующим целевым объектом. Итак, сохраните результат сопоставления в переменную:

var mappedAppInfo = _mapper.Map(appInfoToUpdate, appInfo);

, а затем передайте его в службу, чтобы сделанные изменения можно было сохранить с EF:

await _putAppInfoBll.PutAppInfo(mappedAppInfo, appInfoToUpdate);

Заключительное примечание: если вы этого не сделаете что-то еще с appInfoToUpdate, оно вам не нужно для сохранения изменений, внесенных в сущность AppInfo. С кодом, который вы показали, я не вижу причин, по которым нужно его передавать. Просто сохраните изменения, сделанные в AppInfo.

Но давайте go глубже! Если объект AppInfo отслеживается, вам также не нужно передавать его службе, просто сохраните изменения из контекста БД (при условии, что ваша служба просто сохраняет изменения в базе данных и больше ничего не делает).

dbContext.SaveChanges();

Подробнее об API отслеживания EF см. В документах .

...