Объект слияния EF6 из WebApi
-
20-12-2019 - |
Вопрос
Мне поручили славную миссию по модернизации системы CRUD (Ирония).Я использую EF 6.1.1 и WebApi.Я отправляю Entity с помощью DTO (на данный момент динамический объект создаст статический тип, когда все работает, а также будет выполнять вызовы async
)
[HttpGet]
public dynamic Get(int id)
{
var p = personRepository.Get(id);
return new
{
p.PersonId,
p.BirthYear,
p.DeathYear,
p.Comment,
PersonNames = p.PersonNames.Select(pn => new { pn.PersonId, pn.PersonNameId, pn.NameTypeId, pn.Firstname, pn.Prefix, pn.Surname })
};
}
Затем я обновляю поля на Person
объект или добавить/удалить/обновить PersonNames
сбор с использованием Knockout
и ko.mapping
Я отправляю результат в этот метод WebApi
[HttpPost]
public void Post([FromBody]Person person)
{
personRepository.Merge(person);
}
Все идентификаторы и т. д. верны, в personRepository.Merge
я пробовал
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
db.SaveChanges();
}
Это работает для полей непосредственно в объекте person, но не работает при добавлении/удалении/обновлении в PersonNames
Могу ли я поддержать это без написания кода слияния вручную?
РешениеЗакончилось тем, что сделал это
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
var existingNames = db.PersonNames.Where(pn => pn.PersonId == person.PersonId).ToList();
var deleted = existingNames.Where(pn => person.PersonNames.All(d => d.PersonNameId != pn.PersonNameId));
db.PersonNames.RemoveRange(deleted);
foreach (var name in person.PersonNames)
{
db.PersonNames.AddOrUpdate(name);
}
db.SaveChanges();
}
Решение
Учитывая, что вы упомянули, что это система CRUD, мне все это кажется разумным.Я не понимаю, как на самом деле можно избежать сопоставления вашего DTO с объектами вашего домена (например,Человек)
Думаю, вы уже об этом подумали, но как насчет удаления как можно большего количества шаблонного кода слияния с помощью чего-то вроде AutoMapper? https://github.com/AutoMapper/AutoMapper
Сопоставление навигационных свойств усложняется (т.е.сопоставление между графом объектов DTO и графом объектов сущностей).Эта ссылка содержит гораздо больше деталей, чем я могу: http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/