2013-02-04 15 views
9

Sto lavorando con un progetto EF Primo progetto, e tutto va bene. Ho una semplice classe, cliente. Nella mia classe cliente ho un campo che voglio crittografare (sì, so di poter cifrare a livello di database ma i requisiti dettano la crittografia a livello di dominio/codice), quindi spero di poter fare qualcosa di simile al seguente:Codice quadro entità Primo, setter non vuoto o getter?

public class Customer 
{ 
    public int CustomerID { get; set; }  
    public string FieldToEncrypt { get; set { _FieldToEncrypt = MyEncryptionFunction.Encrypt(); } } 
} 

Tuttavia, suppongo che se il setter ha una definizione, un'entità codice del framework primo può ignorare che la proprietà durante la generazione dello schema. Quindi la mia domanda è: c'è un modo per fare il codice EF prima con i getter/setter forniti, o dovrei spostare questa funzionalità in un costruttore? Devo sostituire uno dei metodi/eventi che si verificano quando il contesto sta salvando?

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

Come nota, io sto usando DataService per trasmettere i dati su un servizio di protocollo OData. Questo genera automaticamente metodi di inserimento/aggiornamento/selezione. Alcuni dei suggerimenti richiedono la creazione di una seconda proprietà, ma la classe DataService non sembra passare attraverso le proprietà NotMapped. Questo getta un po 'una piega nella mia precedente domanda.

+0

Se si sta eseguendo la crittografia su una stringa, suggerirei di inserirlo il più vicino possibile all'input. Ad esempio, dove si esegue 'FieldToEncrypt =" asdf ";' (crittografia gestita nel setter), passare a 'FieldToEncrypt = MyEncryptionFunction.Encrypt (" asdf ");' –

+2

Hai provato? Ci sono un certo numero di risposte simili su SO che suggeriscono che questo funziona fuori dalla scatola nel modo che stai cercando. Vedi http://stackoverflow.com/questions/11962532/what-does-entityframework-code-first-do-with-property-getters-setters e http://stackoverflow.com/questions/8990319/have-a-custom -setter-on-property-for-ef-code-first-model-entity – Zeph

+0

Il secondo link che hai fornito sembra essere più vicino a ciò di cui ho bisogno. Tuttavia, sta parlando di "non mappare" il campo. Voglio che il campo sia mappato, ancora. Voglio solo che il valore mappato venga trasformato prima che il valore sia bloccato nel database. Immagino di avere una domanda più profonda, e cioè: In codice EF Prima, il codice chiama i getter e setter prima/dopo l'inserimento? – Richthofen

risposta

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, ma sto cercando mentalmente di elaborare GET vs SET. Quindi, quando Entity Framework tenta di scrivere i dati nel database, chiama "GET" sull'oggetto? In tal caso, i dati nel database verranno decodificati e quindi inseriti nel database. In questo esempio, sono preoccupato che i dati vengano crittografati solo in memoria e non quando persistono. Ho provato la dichiarazione SET e ha funzionato sorprendentemente esattamente come volevo. Cosa fornisce l'annotazione 'NotMapped'? Dice al framework di * non * persistere quella colonna nel db? se così fosse, non funzionerebbe per il mio esempio. – Richthofen

+0

In questo esempio si avranno solo due colonne nel database: CustomerID e EncryptedField (con valore di campo crittografato). I dati non crittografati non verranno archiviati da nessuna parte, né nel database né nella memoria. L'annotazione 'NotMapped' dice a EF di saltare la proprietà e non generare una colonna nel database per questa proprietà –

+0

Ok. Ma invece di dividerlo in due campi, uno non mappato e uno mappato, posso farlo con un solo campo, mappato? – Richthofen