Entidad de fusión EF6 de WebApi
-
20-12-2019 - |
Pregunta
Se me ha encomendado la gloriosa misión de modernizar un sistema CRUD (Irónico).Estoy usando EF 6.1.1 y WebApi.Envío la Entidad usando un DTO (el objeto dinámico por ahora creará un tipo estático cuando todo esté funcionando, también realizará las llamadas 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 })
};
}
Luego actualizo los campos en el Person
objeto o agregar/eliminar/actualizar PersonNames
colección usando Knockout
y ko.mapping
Publico el resultado en este método WebApi.
[HttpPost]
public void Post([FromBody]Person person)
{
personRepository.Merge(person);
}
Todas las identificaciones, etc. son correctas, en personRepository.Merge
He intentado
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
db.SaveChanges();
}
Esto funciona para los campos directamente en el objeto persona, pero no funciona con agregar/eliminar/actualizar en el PersonNames
¿Puedo soportar esto sin escribir código de combinación manual?
SoluciónTerminé haciendo esto
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();
}
Solución
Dado que ha mencionado que este es un sistema CRUD, todo esto me parece sensato.No veo cómo puedes realmente evitar el mapeo desde la parte posterior de tu DTO a las entidades de tu dominio (p. ej.Persona)
Supongo que ya lo habrás pensado, pero ¿qué tal si eliminas la mayor cantidad posible de código de combinación de placas repetitivas usando algo como AutoMapper? https://github.com/AutoMapper/AutoMapper
El mapeo se vuelve complicado para las propiedades de navegación (es decir,mapeo entre un gráfico de objetos de DTO a un gráfico de objetos de entidades).Este enlace entra en muchos más detalles de los que puedo: http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/