Ich habe begonnen, this Erweiterung zu verwenden, und möchte nur sagen, es ist sehr gut, danke!Verschieben von Objekten zwischen den Listen AutoMapper und EF6
Jetzt habe ich ein Problem, in dem ein Objekt kann von 1 Sammlung, in einer anderen Sammlung verschoben werden, und wenn ich das tue, erhalte ich eine Ausnahme
InvalidOperationException: Multiplicity Einschränkung verletzt
Ich vermute, das liegt daran, dass das Objekt nicht in der ursprünglichen Sammlung gefunden wird, und diese Erweiterung fügt das Objekt der neuen Sammlung hinzu, obwohl ich es auch verschieben möchte, EF dann beim Speichern die Ausnahme, weil ich habe 2 Objekte mit dem gleichen Schlüssel gegen meinen Kontext.
Aber wie kann ich das zum Funktionieren bringen?
Also, wenn ich die folgende Objektstruktur haben
MyRoot
| Collection
| MyChild
| Collection
| MyObject (1)
| MyChild
| Collection
| MyObject (2)
Wie kann ich MyObject (1)
in die gleiche Sammlung wie MyObject (2)
bewegen ??
Diese sind alle Basisobjekte, und hier ist ein einfacher Code
public class MyRoot
{
public int Id { get; set; }
public ICollection<MyChild> MyChildren { get; set; }
}
public class MyChild
{
public int Id { get; set; }
public int RootId { get; set; }
public MyRoot Root { get; set; }
public ICollection<MyObject> MyObjects { get; set; }
}
public class MyObject
{
public int Id { get; set; }
public string Name { get; set; }
public int ChildId { get; set; }
public MyChild Child { get; set; }
}
Jedes dieser Objekte eine DTO haben, aus Gründen der diesem Beispiel können sagen, nur die Objekte sind genau die gleichen, mit der Erweiterung DTO am Ende (das nicht der Fall in realen Anwendung ist)
in meiner Anwendung habe ich dann ein AutoMapper Profil haben, wie so
internal class MyProfile: Profile
{
public MyProfile()
{
this.CreateMap<MyRoot, MyRootDTO>()
.ReverseMap();
this.CreateMap<MyChild, MyChildDTO>()
.ReverseMap()
.EqualityComparison((s, d) => s.Id == d.Id);
this.CreateMap<MyObject, MyObjectDTO>()
.ReverseMap()
.EqualityComparison((s, d) => s.Id == d.Id);
}
}
auf meiner Web-api cont Roller-Methode, ich habe dies, die sehr einfach ist
public async Task<IActionResult> UpdateAsync([FromBody] MyRootDTO model)
{
// get the object and all children, using EF6
var entity = await _service.GetAsync(model.Id);
// map
_mapper.Map(model, entity);
// pass object now updated with DTO changes to save
await _service.UpdateAsync(entity);
// return
return new OkObjectResult(_mapper.Map<MyRootDTO>(entity));
}
Wenn jemand bitte helfen könnte, das wäre toll!
wenn ich das tun, EF versucht, die Felder gegen das Kind Tabelle zu erzeugen, wie gut? Soll es das tun? Da dies ein einfaches Beispiel ist, ist es in Ordnung, aber mein aktuelles System verweist überall auf Felder und viele fremde Schlüsselfelder versuchen hinzugefügt zu werden. – Gillardo
Es bedeutet, dass Sie zusätzliche Schlüsselfelder benötigen, um Ihre Beziehungen mit multiplen zu arbeiten. Ebene, aber es liegt an Ihnen, ob Sie diese Funktionalität möchten. Ohne dies müssen Sie speziell auf das EF-Material verweisen, um eine Entity zu verschieben. – Richard
Wenn du sagst "referenziere das EF-Material, um eine Entity zu bewegen", was meinst du? – Gillardo