Pergunta

Fui incumbido da gloriosa missão de modernizar um sistema CRUD (Irônico).Estou usando EF 6.1.1 e WebApi.Eu envio a Entidade usando um DTO (objeto dinâmico por enquanto criará um tipo estático quando tudo estiver funcionando, também fará as chamadas 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 })
    };
}

Em seguida, atualizo os campos no Person objeto ou adicionar/remover/atualizar PersonNames coleção usando Knockout e ko.mapping

Eu posto o resultado neste método WebApi

[HttpPost]
public void Post([FromBody]Person person)
{
    personRepository.Merge(person);
}

Todos os id's etc estão corretos, em personRepository.Merge eu tentei

public void Merge(Person person)
{
    db.People.AddOrUpdate(person);
    db.SaveChanges();
} 

Isso funciona para os campos diretamente no objeto person, mas não funciona com adicionar/remover/atualizar no PersonNames

Posso oferecer suporte a isso sem escrever código de mesclagem manual?

SoluçãoAcabei fazendo isso

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();
}
Foi útil?

Solução

Dado que você mencionou que este é um sistema CRUD, tudo isso parece sensato para mim.Não vejo como você pode realmente evitar o mapeamento do seu DTO para as entidades do seu domínio (por exemplo,Pessoa)

Espero que você já tenha pensado nisso, mas que tal remover o máximo possível de código de mesclagem padrão usando algo como o AutoMapper? https://github.com/AutoMapper/AutoMapper

O mapeamento fica complicado para propriedades de navegação (ou seja,mapeamento entre um gráfico de objeto de DTOs e um gráfico de objeto de entidades).Este link fornece muito mais detalhes do que eu posso: http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top