Использование Automapper для обновления существующего объекта с меньшим количеством свойств

Я использую EF5 и MVC. Я использую Automapper, чтобы сопоставить создание модели для редактирования модели. Потому что мне нужно меньше свойств в Edit, чем в Create.

Предположим, это мой класс, который я связываю с EF.

 public partial class Users
        {
            public long User_id { get; set; }
            [Required]
            [StringLength(30, ErrorMessage = "LastName cannot be longer than 30 characters.")]
            public string LastName { get; set; }
            [Required]
            [StringLength(30, ErrorMessage = "Name cannot be longer than 30 characters.")]
            public string Name { get; set; }
            public string Password { get; set; }
            public System.DateTime CreationDate { get; set; }

   [NotMapped] // Does not effect with your database
    [RegularExpression(@"^.{5,}$", ErrorMessage = "Minimum 3 characters required")]
    [StringLength(9, MinimumLength = 3, ErrorMessage = "Confirm Password cannot be longer than 9 characters.")]
    [Compare("Password")]
    public virtual string ConfirmPassword { get; set; }
    }

В таблице My DataBase столбец CreationDate а также Password являются обязательными

В моей модели UserEditMode мне не нужны эти свойства.

  public class UserEditView
        {public long User_id { get; set; }
            [Required]
            [StringLength(30, ErrorMessage = "LastName cannot be longer than 30 characters.")]
            public string LastName { get; set; }
            [Required]
            [StringLength(30, ErrorMessage = "Name cannot be longer than 30 characters.")]
            public string Name { get; set; }
    }

Когда я обновляю свою таблицу, я делаю Mapper из UserEditView в User Model.

  public async Task<ActionResult> Edit(UserEditViewModel model, System.Web.HttpPostedFileBase image = null)
{
    var user = _db.Users.FirstOrDefault(p => p.User_id == model.user.User_id);
      Mapper.Map<UserEditView, Users>(model.user, user);
     _db.SaveChanges();
    }

Но, как я не определяю CreationDate а также Passoword для моей редактируемой модели в моей пользовательской модели установлено значение null. Скоро _db.SaveChanges(); выдает ошибку при обновлении.

Как я могу сопоставить "Меньше свойств" с "Исходной моделью", чтобы поддерживать те свойства, которые необходимы для сопоставления с моей базой данных?

Спасибо

Это работает, спасибо!!! Но чего-то не хватает...

Я определил как свойство

 [NotMapped]
 [Compare("Password")]
 public virtual string ConfirmPassword { get; set; }

Как не отображается... когда я мапп

 Mapper.Map<UserEditView, Users>(model.user, user);

user.ConfirmPassword имеет значение null.

Это дает мне ошибку на

 _db.SaveChanges();

я должен сделать

user.ConfirmPassword=user.Password before  _db.SaveChanges();

для того, чтобы работать.

Там грязно делать что-то подобное.

Как я могу Mapp, когда есть свойство [NotMapped]?

еще раз спасибо

1 ответ

Решение

Используйте что-то подобное при настройке отображения.

 .ForMember(x => x.Id, opt => opt.Ignore())

    For example 
     Mapper.CreateMap<ClassA, ClassB>()
    .Ignore(record => record.Field)
    .Ignore(record => record.AnotherField)
    .Ignore(record => record.Etc);
Другие вопросы по тегам