5

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?

Antwort

3

Ihre Frage bezieht sich darauf, wie Architektur für eine Anwendung entworfen wird. Technisch gesehen gibt es mehr als ein Modell in einer Anwendung: Domänenmodell, Datenübertragungsobjekt oder Ansichtsmodell für verschiedene Schichten: Geschäftslogikschicht, Verteilungsschicht und Darstellungsschicht.

Missbrauch des Modells in ASP.NET MVC, ich sehe oft Domänenmodell (von EF) als Ansichtsmodell zu verwenden, da es in einigen Fällen korrekt ist, dass das Domänenmodell als Ansichtsmodell für Ihre UI ausreicht. Aber eigentlich ist es ganz anders. Bei einer komplexen Benutzeroberfläche, z. B. Grid, müssen möglicherweise mehr als ein Domänenmodell in einem Ansichtsmodell kombiniert werden, um Daten für Ihre Benutzeroberfläche bereitzustellen.

Ähnlich wie mit der Verteilungsebene, ASP.net Web API, Verbraucher benötigen mehr als ein Domänenmodell, um etwas zu tun. Es ist normalerweise kein 100% Domänenmodell als Datenübertragungsobjekt.

Also, für die Trennung von Interesse, würde es vorgeschlagen, dass Sie erstellen und trennen DTO-Objekt mit Domain-Objekt (POCO-Objekt von EF), auch ist es 1: 1 in Eigenschaften zugeordnet.

Beispiel: Wenn Sie ein Kundendomänenmodell haben, benötigen Sie CustomerDto.

Sie können manuell zuordnen oder ein Tool wie AutoMapper verwenden, um Ihr Domänenmodell dem DTO-Modell zuzuordnen.

Auf diese Weise können Sie auch Ihre Probleme vermeiden.

+2

+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. –

+0

Danke, ich werde AutoMapper auschecken - es klingt wie nur die "Hilfsklasse einer Art", nach der ich gesucht habe. –

1

ich gewusst, dass Sie die Antwort bekam, aber sein können Sie einen Blick auf diese nehmen wollen:

Die POCO Proxy-Typ kann nicht direkt serialisiert oder von der Windows Communication Foundation (WCF) deserialisiert , da die DataContractSerializer-Serialisierungs-Engine nur bekannte Typen serialisieren und deserialisieren kann.Der Proxy-Typ ist kein bekannter Typ. Weitere Informationen finden Sie im Abschnitt POCO-Proxies serialisieren im Thema Arbeiten mit POCO-Entitäten. Um POCO-Proxies als POCO-Entitäten zu serialisieren, verwenden Sie die ProxyDataContractResolver-Klasse, um Proxy-Typen während der Serialisierung den POCO-Typen zuzuordnen.

http://msdn.microsoft.com/en-us/library/vstudio/ee705457(v=vs.100).aspx

+0

Interessant, danke. –

Verwandte Themen