Вопрос

Мне поручили славную миссию по модернизации системы 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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top