Wie kann ich Breeze sagen, eine Eigenschaft aus einer Code-generierten Entity vollständig zu ignorieren?

7

Gibt es ein .Net-Attribut, das Breeze anzeigt, eine Eigenschaft vollständig zu ignorieren? Ich weiß, dass es eine Möglichkeit ist, die Eigenschaft zu schützen, indem sie die Eigenschaft schützt und die Serialisierung verhindert, aber was ist, wenn ich möchte, dass sie öffentlich bleibt?

    
pawel 29.04.2013, 09:23
quelle

2 Antworten

15

Es ist schwierig, einen einfachen, wartbaren Weg zu finden, wie EF-generierte Metadaten dem Kunden eine Sache und der EF selbst eine Sache sagen.

Aber Sie können es tun, wenn Sie zwei DbContexte haben wollen: den "echten" DbContext für serverseitige Modelloperationen und einen weiteren DbContext ausschließlich für die Generierung von Clientmetadaten.

Ein DbContext für Metadaten

Es ist nicht so schwierig wie es klingt. Ich habe in DocCode mit so etwas experimentiert. Ich habe eine NorthwindMetadataContext erstellt, die von NorthwindContext erbt. Es verbirgt die nicht verwendete Eigenschaft CustomerID_OLD .

Hier ist dieser DbContext in seiner Gesamtheit:

%Vor%

Sie haben das richtig gelesen! Ich füge einfach eine einzige Anweisung EF Fluent API hinzu, um die Eigenschaft CustomerID_OLD vor der NorthwindMetadataContext zu verbergen.

Es befindet sich immer noch im Customer -Typ und ist der Basis NorthwindContext immer noch bekannt. Das bedeutet, dass eine Abfrage die CustomerID_OLD -Eigenschaft zurückgibt, wenn Sie mit NorthwindContext abfragen, aber die Eigenschaft nicht zurückgibt, wenn Sie mit NorthwindMetadataContext abfragen.

Natürlich verwenden Sie nur NorthwindMetadataContext , um Metadaten für den Breeze-Client zu generieren. Die gesamte Serverlogik verwendet weiterhin die "echte" Basis NorthwindContext

Ich stelle sicher, dass das passiert, indem ich die Art ändere, wie NorthwindRepository die Eigenschaft Metadata implementiert:

%Vor%

Alle anderen Mitglieder von NorthwindRepository verwenden einen EFContextProvider für den "echten" DbContext :

%Vor%

Das funktioniert wie ein Zauber. Soweit der Kunde weiß, existiert die Eigenschaft CustomerID_OLD nicht.

Versuchen Sie, die versteckten Daten von der Leitung fernzuhalten

Obwohl Sie die Eigenschaft von Breeze-Clients ausgeblendet haben, bleibt die Eigenschaft auf dem serverseitigen Entitätstyp und, da wir den "echten" DbContext für die Abfrage- und Speicheroperationen verwenden, können Sie die CustomerID_OLD -Eigenschaft sehen über die Leitung in der Abfrage Nutzdaten.

Damit dies nicht passiert, können Sie der Eigenschaft [JsonIgnore] im Modell das JSON.NET-Attribut serializer Customer.CustomerID_OLD hinzufügen (Sie verwenden andere JSON.NET-Konfigurationsoptionen, wenn Sie Ihr Modell nicht mit verschmutzen möchten JSON.NET-Serialisierungsattribute).

Noch einmal ausführen und CustomerID_OLD wird nicht mehr serialisiert. Die Eigenschaft CustomerID_OLD ist nun für den Client vollständig unsichtbar, während sie in Ihrem Modell auf dem Server noch verfügbar ist.

ACHTUNG

Die Eigenschaft, die in den Metadaten verborgen ist, ist vor Breeze-Clients verborgen ... aber nicht vor der Welt. Da diese Eigenschaft auf dem SERVER-SIDE TYPE verfügbar sein soll, kann ein böser Client (kein Breeze-Client) diese Daten trotzdem mit einer Projektion abrufen, obwohl Sie diese beim Serialisieren von abgeschlossen haben Geben Sie ein.

Die folgende Abfrage-URL gibt Projektionsdaten zurück, die die CustomerID_OLD enthalten, die bei einer Abfrage für ganze Customer -Objekte unsichtbar wären.

%Vor%

Hier ist ein bisschen das Ergebnis:

%Vor%

Vielleicht ernster , ein POST kann auf diese versteckte Eigenschaft in der Nutzlast einer "SaveChanges" -Anforderung aktualisieren.

Wie immer bei vertraulichen Daten müssen Sie jede Speicheranforderung prüfen , um sicherzustellen, dass der Benutzer jeden in der OriginalValues -Auflistung identifizierten geänderten Eigenschaftswert speichern kann.

Wenn Sie Sicherheitsbedenken haben, ist es meiner Meinung nach viel sicherer, DTOs für Typen zu verwenden, die Daten enthalten, die nicht an nicht autorisierte Clients weitergegeben werden dürfen. Ich mag DTOs nicht für jeden Typ; das ist Overkill, das die Produktivität ruinieren kann. Aber ich mag sie für Entitätstypen mit erheblichen Vertraulichkeitsanforderungen.

Beispielcode

Ich habe mich noch nicht entschieden, ob ich dieses Beispiel im veröffentlichten DocCode behalten oder in meiner privaten Reserve speichern werde. Es ist ein cooler Trick.

Meine Sorge ist, dass die Leute denken werden, dass diese Technik eine sichere Methode ist, vertrauliche Daten zu verstecken, was sie definitiv nicht ist. Es ist in Ordnung, Daten zu verbergen, die Sie lieber versteckt halten möchten. Aber wenn es von der Leitung ferngehalten werden muss, verwenden Sie besser ein DTO.

Lassen Sie mich wissen, ob das, was ich beschrieben habe, klar genug ist, dass Sie ohne ein konkretes Beispiel fortfahren können.

    
Ward 01.05.2013, 07:33
quelle
5

Wenn Sie den Json.Net-Serializer (den Breeze.WebApi-Standard) verwenden, können Sie das JsonIgnoreAttribute verwenden, wie beschrieben in hier

    
Jay Traband 30.04.2013 05:31
quelle

Tags und Links