Domanda

Sono stato incaricato della gloriosa missione di modernizzare un sistema crud (ironico).Sto usando EF 6.1.1 e Webapi.Invio l'entità utilizzando un DTO (oggetto dinamico per ora creerà un tipo statico quando tutto funziona, renderà anche le chiamate 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 })
    };
}
.

I Poi aggiorno i campi sull'oggetto Person o aggiungi / rimuovi / aggiorna la raccolta PersonNames utilizzando Knockout e ko.mapping

I post il risultato in questo metodo WebAPI

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

Tutti gli ID sono corretti, in personRepository.Merge ho provato

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

funziona per i campi direttamente sul personaleObject, ma non funziona con Aggiungi / Rimuovi / Aggiornamento sul PersonNames

Posso supportare questo senza scrivere il codice di unione manuale?

Soluzione Finito per fare questo

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();
}
.

È stato utile?

Soluzione

Dato che hai menzionato questo è un sistema crudo che sembra molto ragionevole per me.Non riesco a vedere come puoi davvero evitare la mappatura dalla tua DTO è tornata alle tue entità di dominio (ad esempio persona)

Mi aspetto che tu abbia già pensato che, ma che ne dici di rimuovere il maggior numero possibile di il codice di caldaia unire il codice di unione usando qualcosa come Automapper? https://github.com/automapper/automapper

La mappatura viene complicata per le proprietà di navigazione (cioè la mappatura tra un grafico oggetto di DTO è tornato a un grafico oggetto di entità).Questo collegamento entra in molto più dettagli di quanto posso: http://rogeralsing.com/2013/12/01/Why-mapping-dtos--Stities-USH-AUTOMAPPER-And-ENTITYFRAMEWARK-IS-RUCKER / .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top