WCF, Entity Framework & Datenverträge

datacontract entity-framework wcf

Frage

Verwenden von VS 2008 und .NET 3.5 SP1:

Ich verwende WCF, um Clients die Verbindung zu einem Dienst zu ermöglichen, der Datenbankeinträge mit Entity Framework liest und schreibt. Standardmäßig wird für die Entitäten, die automatisch aus der Datenbank generiert werden, das DataContract-Attribut angewendet.

Leider sind viele der Felder nicht für den Verbrauch durch den Kunden bestimmt (dh Aufzeichnungen darüber, wer auf welche Daten zugreift usw.), und aus Sicherheitsgründen möchte ich verhindern, dass sie freigelegt werden. Gibt es eine Möglichkeit, zu vermeiden, dass Entity Framework-Klassen auf diese Weise verfügbar gemacht werden?

Anmerkung : Dies ist kein Duplikat von So verhindern Sie, dass private Eigenschaften in .NET-Entitäten über Services als öffentlich verfügbar gemacht werden? . In dieser Frage möchte der Benutzer bestimmte Felder selektiv anzeigen, während ich möchte, dass die Entität überhaupt nicht als DataContract angezeigt wird.

Danke im Voraus.

Akzeptierte Antwort

Ist Ihnen bewusst, dass Ihre Entitäten nicht eins zu eins mit der Datenbank abbilden müssen? Insbesondere können Sie Spalten oder ganze Tabellen auslassen, die nicht relevant sind.

Das Entitätsmodell soll ein konzeptionelles Modell sein. Sie können auf einfache Weise eine Gruppe von Entitäten erstellen, um sich einer Gruppe von Clients (etwa Web-Services) und einer anderen Gruppe zuzuordnen, die derselben Datenbank zugeordnet ist und für einen anderen Client (Web-Anwendung, möglicherweise) bestimmt ist.

Andererseits empfehle ich immer, Entity Framework-Objekte niemals über einen Webdienst verfügbar zu machen. Microsoft macht leider implementierungsabhängige Eigenschaften verfügbar, indem sie mit [DataMember] gekennzeichnet werden. Ich habe es gerade mit einem einfachen Dienst ausprobiert, der einen SalesOrderHeader von AdventureWorks zurückgibt. Mein Client hat Proxy-Versionen der folgenden EF-Typen erhalten:

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • EntityKey
  • EntityReference
  • RelatedEnd

Dies sind keine Dinge, über die Ihre Kunden Bescheid wissen müssen.

Ich ziehe es vor, Datenübertragungsobjekte freizugeben und die Eigenschaften von einem zum anderen zu kopieren. Offensichtlich wird dies durch Reflektion oder Code-Generierung besser als von Hand gemacht. Ich habe es in der Vergangenheit durch Code-Generierung gemacht (T4-Vorlagen).

Eine Option, die ich nicht ausprobiert habe, ist AutoMapper .


Beliebte Antwort

Wir verwenden separate Klassen für die DataContract-Objekte. Wir haben eine Schnittstelle mit einer Methode, ToContract (), und alle unsere Entitäten implementieren diese Schnittstelle in einer partiellen Klassendatei. Es ist zusätzliche Arbeit und eine Boilerplate, aber es scheint der einfachste Weg zu sein, um die Trennung und Granularität der Steuerung zu erhalten, die wir brauchen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum