带有自定义不可编辑值的数据库字段

问题描述:

我对实体框架非常陌生,所以我没有弄清楚如何解决我的问题。我有一个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将不具有用户输入的字段;我希望他能够通过某种逻辑(在他的二传手中出现的逻辑)来确定他。当我需要更新某些用户敏感数据时,我会将其用于安全检查。

我在正确的道路上?什么是正确的方法来做到这一点?

在此先感谢!

在其身体的任何地方不使用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