Entidade de mesclagem EF6 do WebApi
-
20-12-2019 - |
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();
}
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/