2013-05-13 48 views
1

我對實體框架非常陌生,所以我沒有弄清楚如何解決我的問題。我有一個User實體,如下所示:帶有自定義不可編輯值的數據庫字段

public int ID { get; set; } 
public string Name { get; set; } 
public string Email { get; set; } 
public string Username { get; set; } 
public string Password { get; set; } 
public string Checksum 
{ 
    get 
    { 
     return Checksum; 
    } 

    set 
    { 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] originalBytes = ASCIIEncoding.Default.GetBytes(this.Email); 
     byte[] encodedBytes = md5.ComputeHash(originalBytes); 

     Checksum = BitConverter.ToString(encodedBytes); 
    } 
} 

Checksum將不具有用戶輸入的字段;我希望他能夠通過某種邏輯(在他的二傳手中出現的邏輯)來確定他。當我需要更新某些用戶敏感數據時,我會將其用於安全檢查。

我在正確的道路上?什麼是正確的方法來做到這一點?

在此先感謝!

回答

1

在其身體的任何地方不使用value的二傳手是濫用該技術的指標。如果一個字段是隻讀的,只提供一個getter。如果您計劃放棄正在設置的值,請​​不要提供setter。取而代之的是,決定計算出的值所依賴的值,然後將您設置的Checksum的設置邏輯移到其設置器中。

以你的班級爲例,這裏唯一的依賴是Email屬性。您可以按如下方式更改班級:

public int ID { get; set; } 
public string Name { get; set; } 
private string email; 
public string Email { 
    get { return email; } 
    set { email = value; UpdateChecksum(); } 
} 
public string Username { get; set; } 
public string Password { get; set; } 
private string checksum; 
public string Checksum { 
    get { return checksum; } 
} 
private void UpdateChecksum() { 
    MD5 md5 = new MD5CryptoServiceProvider(); 
    byte[] originalBytes = ASCIIEncoding.Default.GetBytes(email); 
    byte[] encodedBytes = md5.ComputeHash(originalBytes); 
    checksum = BitConverter.ToString(encodedBytes); 
} 

請注意UpdateChecksum如何移入單獨的方法。在有多個依賴關係的情況下,這很有用:不要將邏輯嵌入到各個設置器中,最好將其移入方法中,並根據需要調用它。

+0

謝謝@dasblinkenlight,我已經不瞭解這個概念。我已經經歷了一些麻煩,可以爲我的數據庫映射字段,因爲它沒有setter,但現在一切都按預期工作:-) – 2013-05-13 21:06:59

相關問題