Frage

Ich wurde mit der glorreichen Mission beauftragt, ein CRUD-System zu modernisieren (ironisch).Ich verwende EF 6.1.1 und WebApi.Ich sende die Entität mit einem DTO (dynamisches Objekt erstellt vorerst einen statischen Typ, wenn alles funktioniert, und führt auch die Aufrufe durch 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 })
    };
}

Ich aktualisiere dann die Felder auf dem Person Objekt hinzufügen oder hinzufügen/entfernen/aktualisieren PersonNames Sammlung mit Knockout Und ko.mapping

Ich poste das Ergebnis in dieser WebApi-Methode

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

Alle IDs usw. sind korrekt personRepository.Merge ich habe es versucht

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

Dies funktioniert für die Felder direkt auf dem Personenobjekt, aber nicht mit Hinzufügen/Entfernen/Aktualisieren auf dem PersonNames

Kann ich dies unterstützen, ohne manuellen Zusammenführungscode zu schreiben?

LösungAm Ende habe ich das gemacht

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();
}
War es hilfreich?

Lösung

Da Sie erwähnt haben, dass es sich um ein CRUD-System handelt, erscheint mir das alles vernünftig.Ich kann mir nicht vorstellen, wie Sie die Zuordnung von Ihren DTOs zurück zu Ihren Domain-Entitäten (z. B.Person)

Ich gehe davon aus, dass Sie bereits darüber nachgedacht haben, aber wie wäre es, wenn Sie mit etwas wie AutoMapper so viel Boiler-Plate-Merge-Code wie möglich entfernen würden? https://github.com/AutoMapper/AutoMapper

Bei Navigationseigenschaften wird die Zuordnung kompliziert (d. h.Zuordnung zwischen einem Objektgraphen von DTOs und einem Objektgraphen von Entitäten).Dieser Link geht weitaus detaillierter als ich kann: http://rogeralsing.com/2013/12/01/why-mapping-dtos-to-entities-using-automapper-and-entityframework-is-horrible/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top