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

时间:2013-05-13 15:01:07

标签: c# .net entity-framework

我对Entity Framework很新,所以我不知道如何解决我的问题。我有一个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 个答案:

答案 0 :(得分:1)

在其身体的任何地方不使用value的setter是滥用技术的指标。如果字段是只读的,则只为其提供一个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如何移入单独的方法。这在您有多个依赖项的情况下很有用:不是将逻辑嵌入到单个setter中,最好将其移动到方法中,并根据需要调用它。