Как я могу использовать Automapper для обновления объекта в Entity Framework без обнуления свойств? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь обновить объект, используя Entity Framework, и сохранить его в базе данных.Когда вызывается обновление, мой сервисный метод извлекает DTO, присваивает ему значения объекта сущности, который ему передал пользовательский интерфейс, а затем сохраняет его в базе данных.Вместо того, чтобы вручную присваивать эти значения, я хотел бы использовать Automapper, однако, когда я делаю это, значения, которые я не отображаю, обновляются до нуля.Есть ли способ в Entity Framework или Automapper предотвратить это?

Сервисный метод находит существующий объект в базе данных, присваивает ему свойства нового объекта, а затем сохраняет:

public void Update(MyEntity updatedEntity, int id)
{
    var existingObject = db.tblmyentity.Find(id);

    existingObject.name = updatedEntity.name;
    existingObject.address = updatedEntity.address;
    existingObject.phone = updatedEntity.phone;

    db.SaveChanges();
}

Однаков полях этого объекта хранятся значения, недоступные для пользовательского интерфейса, например, кто и когда изменил объект.Использование AutoMapper для упрощения этого кода (показано ниже) приводит к обновлению этих полей до нуля:

public void Update(MyEntity updatedEntity, int id)
{
    var existingObject = db.tblmyentity.Find(id);

    Mapper.Map(updatedEntity, existingObject);

    db.SaveChanges();
}

1 Ответ

0 голосов
/ 18 мая 2018

Хорошей практикой является создание модели (service, api), которая содержит только соответствующие свойства, которые могут быть обновлены.Например:

public class MyEntityServiceModel
{
    public string name { get; set; }
    public string address { get; set; }
    public string phone { get; set; }
}

// this looks differently in recent versions of AutoMapper, but you get the idea
Mapper.CreateMap<MyEntityServiceModel, MyEntity>();

// your update functions looks the same, except that it receives a service model, not a data model

Update(MyEntityServiceModel updatedEntity, int id) 
{
   // same code here
}

Этот подход имеет следующие преимущества:

  • вы получаете то, что вы запрашиваете
  • безопасность: вы не рискуете обновить больше свойств, чемВам следует, так как модель сервиса четко указывает свойства, которые должны быть обновлены
  • сериализация: модель сервиса более подходит, если вам нужна сериализация (модели EF могут включать нежелательные свойства навигации)
  • Updateпотребитель функций не знает о используемой вами библиотеке постоянства данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...