Question

J'ai été chargé de la glorieuse mission de moderniser un système CRUD (Ironique).J'utilise EF 6.1.1 et WebApi.J'envoie l'entité à l'aide d'un DTO (l'objet dynamique pour l'instant créera un type statique lorsque tout fonctionnera, effectuera également les appels 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 })
    };
}

Je mets ensuite à jour les champs sur le Person objet ou ajouter/supprimer/mettre à jour PersonNames collecte en utilisant Knockout et ko.mapping

Je poste le résultat sur cette méthode WebApi

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

Tous les identifiants, etc. sont corrects, dans personRepository.Merge J'ai essayé

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

Cela fonctionne pour les champs directement sur l'objet personne, mais cela ne fonctionne pas avec l'ajout/suppression/mise à jour sur le PersonNames

Puis-je prendre en charge cela sans écrire de code de fusion manuelle ?

SolutionJ'ai fini par faire ça

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();
}
Était-ce utile?

La solution

Étant donné que vous avez mentionné qu'il s'agit d'un système CRUD, tout cela me semble raisonnable.Je ne vois pas comment vous pouvez vraiment éviter le mappage de votre DTO vers vos entités de domaine (par ex.Personne)

J'imagine que vous y avez déjà pensé, mais que diriez-vous de supprimer autant de code de fusion de plaques chauffantes que possible en utilisant quelque chose comme AutoMapper ? https://github.com/AutoMapper/AutoMapper

La cartographie devient compliquée pour les propriétés de navigation (c'est-à-diremappage entre un graphe d'objets de DTO et un graphe d'objets d'entités).Ce lien donne beaucoup plus de détails que moi : http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top