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

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/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top