2013-02-04 2 views
9

Ich arbeite mit einem EF Code First Projekt, und alles ist gut. Ich habe eine einfache Klasse, Kunde. In meiner Kundenklasse habe ich ein Feld, das ich verschlüsseln möchte (Ja, ich weiß, dass ich auf DB-Ebene verschlüsseln kann, aber Anforderungen diktieren, dass ich auf Domänen-/Codeebene verschlüssle), also hoffe ich, dass ich etwas wie das Folgende machen kann:Entity Framework Code Zuerst nicht leerer Setter oder Getter?

Ich gehe jedoch davon aus, dass Entity Framework Code diese Eigenschaft beim Generieren des Schemas ignorieren kann, wenn der Setter eine Definition hat. Also meine Frage ist, gibt es eine Möglichkeit, EF Code First mit bereitgestellten Getters/Setter zu tun, oder sollte ich diese Funktionalität in einen Konstruktor verschieben? Sollte ich stattdessen eine der Methoden/Ereignisse überschreiben, die beim Speichern des Kontexts passiert?

EDIT * ** * ** * ** * ** * ** * ****

Als Hinweis, ich bin mit DataService, um die Daten über einen OData-Protokolldienst zu übertragen. Dies erzeugt automatisch die Methoden insert/update/select. Einige der Vorschläge erfordern das Erstellen einer zweiten Eigenschaft, aber die DataService-Klasse scheint die NotMapped-Eigenschaften nicht zu passieren. Dies wirft ein bisschen einen Knick in meine frühere Frage.

+0

Wenn Sie eine Verschlüsselung für eine Zeichenfolge ausführen, würde ich vorschlagen, sie so nah wie möglich am Eingang zu platzieren. Wenn Sie 'FieldToEncrypt =" asdf ";' (Verschlüsselung, die in Setter gehandhabt wird) verwenden, ändern Sie zu 'FieldToEncrypt = MyEncryptionFunction.Encrypt (" asdf ");' –

+2

Haben Sie es versucht? Es gibt eine Reihe ähnlicher Antworten zu SO, die darauf hindeuten, dass dies so funktioniert, wie Sie es wünschen. Siehe http://stackoverflow.com/questions/11962532/what-does-entityframework-code-first-do-with-property-getters-setters und http://stackoverflow.com/questions/8990319/have-a-custom -setter-on-property-for-ef-code-first-model-entity – Zeph

+0

Der zweite von Ihnen angegebene Link scheint näher an dem zu sein, was ich brauche. Allerdings redet er darüber, das Feld nicht zu kartieren. Ich möchte, dass das Feld immer noch zugeordnet wird. Ich möchte nur, dass der gemappte Wert transformiert wird, bevor der Wert in der Datenbank feststeckt. Ich denke, ich habe eine tiefere Frage, und das ist: In EF-Code zuerst ruft der Code die Getter und Setter vor/nach dem Einfügen? – Richthofen

Antwort

4
public class Customer 
{ 
    public int CustomerID { get; set; }   
    public string EncryptedField { get; private set; } 

    [NotMapped] 
    public string Field 
    { 
     get { return MyEncryptionFunction.Decrypt(EncryptedField); } 
     set { EncryptedField = MyEncryptionFunction.Encrypt(value); } 
    } 
} 
+0

Ok, aber ich versuche mental das GET vs SET zu erarbeiten. Wenn das Entity Framework dann versucht, die Daten in die Datenbank zu schreiben, ruft es dann das GET für das Objekt auf? Wenn dies der Fall ist, werden die Daten in der Datenbank entschlüsselt und dann in die Datenbank eingefügt. In diesem Beispiel mache ich mir Sorgen, dass die Daten nur im Speicher und nicht im permanenten Speicher verschlüsselt werden. Ich habe die SET-Anweisung ausprobiert und es hat erstaunlich genau funktioniert, wie ich es wollte. Was bietet die Anmerkung "NotMapped"? Gibt es dem Framework zu * not * diese Spalte in der db zu erhalten? Wenn ja, würde es für mein Beispiel nicht funktionieren. – Richthofen

+0

In diesem Beispiel haben Sie nur zwei Spalten in der Datenbank: CustomerID und EncryptedField (mit verschlüsseltem Feldwert). Nicht verschlüsselte Daten werden nirgendwo gespeichert - weder in der Datenbank noch im Speicher. Die Anmerkung "NotMapped" weist EF an, die Eigenschaft zu überspringen und keine Spalte in der Datenbank für diese Eigenschaft zu generieren. –

+0

Ok. Aber anstatt dieses in zwei Felder zu teilen, ein nicht zugeordnetes und ein zugeordnetes, kann ich das einfach mit einem Feld tun, das gemappt ist? – Richthofen