2013-02-04 5 views
9

私はEF Code Firstプロジェクトで作業していますが、すべてうまくいきます。私は簡単なクラス、顧客を持っています。私の顧客クラスでは、暗号化したいフィールドがあります(はい、私はDBレベルで暗号化できますが、ドメイン/コードレベルで暗号化する必要があります)ので、私は次のようなことができると期待しています:エンティティフレームワークコードまず、空でないセッターまたはゲッターですか?

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

しかし、私は、セッターは、定義を持つ場合、スキーマを生成する際に、エンティティ・フレームワークコードは最初にそのプロパティを無視することができると仮定する。だから私の質問は、提供されたgetters/setterでEF Code Firstを行う方法があるのか​​、あるいはこの機能をコンストラクタに移すべきかということです。コンテキストが保存されているときに発生するメソッド/イベントの1つをオーバーライドする必要がありますか?

EDIT * ** * ** * ** * ** ** * ****注意点としては

、私が使用しています* DataServiceを使用して、ODataプロトコルサービスを介してデータを送信します。これにより、挿入/更新/選択メソッドが自動的に生成されます。いくつかの提案では、2番目のプロパティを作成する必要がありますが、DataServiceクラスはNotMappedプロパティを通過していないようです。これは、私の以前の質問に少しぶつかる。

+0

文字列で暗号化を行っている場合は、できるだけ入力の近くに配置することをおすすめします。すなわち、 'FieldToEncrypt =" asdf ";'(setterで暗号化が処理された)の場合、 'FieldToEncrypt = MyEncryptionFunction.Encrypt(" asdf ");' –

+2

に変更しましたか?あなたが探している方法でこれが箱の中で働いていることを示唆しているので、同様の多くの答えがあります。 http://stackoverflow.com/questions/11962532/what-does-entityframework-code-first-do-with-property-getters-settersおよびhttp://stackoverflow.com/questions/8990319/have-a-customerを参照してください。 -setter-on-property-for-ef-code-first-model-entity – Zeph

+0

あなたが提供した2番目のリンクは、私が必要とするものに近いと思われます。しかし、彼はフィールドをマッピングしないことを話しています。私はフィールドをまだマッピングしておきたい。値がデータベースに詰まる前にマップされた値を変換しておきたいだけです。 私はもっと深い疑問を持っていると思います。それは、EF Code Firstでは、挿入前/挿入後にゲッターとセッターを呼び出しますか? – Richthofen

答えて

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

しかし、私は精神的にGET対SETを解決しようとしています。したがって、Entity Frameworkがデータをデータベースに書き込もうとすると、オブジェクトの「GET」が呼び出されますか?そうであれば、データベース内のデータは解読され、データベースに挿入されます。この例では、データがメモリ内でのみ暗号化され、永続化されると暗号化されないことに懸念しています。私はSETステートメントを試して、それが驚くほど正確に私がそれを望んでいた。 「NotMapped」アノテーションは何を提供しますか?それはフレームワークにdbのカラムを永続させないように伝えますか?もしそうなら、私の例ではうまくいかないでしょう。 – Richthofen

+0

このサンプルでは、​​CustomerIDおよびEncryptedField(暗号化されたフィールド値付き)の2つの列のみがデータベースにあります。暗号化されていないデータはデータベースにもメモリにも格納されません。 'NotMapped'アノテーションはEFにプロパティをスキップするように指示し、このプロパティのデータベースにカラムを生成しません。 –

+0

Ok。しかし、これを2つのフィールドに分割するのではなく、マップされていないフィールドとマップされているフィールドに分割する代わりに、マップした1つのフィールドでこれを行うことはできますか? – Richthofen

関連する問題