Использование 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);