Ich habe einige POCO-Objekte, die ich in einem EF Code First-Kontext verwende. Also, wenn ich sie mit Daten fülle, habe ich es tatsächlich mit EF-Proxy-Objekten und nicht mit den POCOs selbst zu tun.Was ist der beste Weg, um ein EF-Proxy-Objekt in das ursprüngliche POCO-Objekt zu verwandeln?
Ich habe einen ASP.NET MVC4 ApiController, der meine POCO-Objekte zurückgibt, die ich in meiner Client-Anwendung verbrauchen werde.
Meine Methode „GET“ sieht etwa wie folgt aus:
// GET api/Clients/5
public Client GetClient(int id)
{
Client client = db.Clients.Find(id);
if (client == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return client;
}
, die tatsächlich nicht funktioniert, denn wenn der Serializer das Client-Objekt zu serialisiert versucht, es tatsächlich ist mit dem EF-Proxy-Version handelt, die bewirkt, es zu Schluckauf. Siehe Can an ApiController return an object with a collection of other objects?
So konnte ich die Proxy-Generierung deaktivieren, indem Sie diese auf meine DbContext
:
db.Configuration.ProxyCreationEnabled = false;
die dafür sorgt, dass ich mit der POCO eher als ein Proxy zu tun habe. Aber jetzt sind die meisten Mitglieder meiner Client-Klasse nicht gefüllt, da es der EF-Proxy war, der diese für mich lahmlegte.
Also was ich wirklich will, ist die EF-Proxy-Klasse zu verwenden, um die Daten zu erhalten, und dann in letzter Minute die ursprüngliche POCO von meiner Methode zurückgeben.
Wie kann ich das tun, ohne manuell das gesamte Objekt von Grund auf (einschließlich verschachtelter Objekte) im Code zu erstellen? Sicherlich muss es einen leichten Weg geben - oder zumindest eine Hilfsklasse?
+1 DTOs auf dem Remote-Client ist die beste Art und Weise ausgesetzt wird zu gehen. Es gibt Ihnen die volle Kontrolle über die Daten, die über die Leitung gesendet werden. –
Danke, ich werde AutoMapper auschecken - es klingt wie nur die "Hilfsklasse einer Art", nach der ich gesucht habe. –