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

本文关键字:数据库 字段 编辑 自定义 | 更新日期: 2023-09-27 18:13:23

我是很新的实体框架,所以我不知道如何解决我的问题。我有一个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将没有用户输入;我希望他是由某种逻辑决定的(在他的setter上出现的逻辑)。当我需要更新一些用户的敏感数据时,我将使用它进行安全检查。

我在正确的道路上吗?正确的做法是什么?

提前感谢!

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

setter在其体内任何地方不使用value是滥用该技术的指示。如果字段是只读的,则只提供getter。如果您打算放弃正在设置的值,则不要提供设置器。相反,决定计算值所依赖的值,并将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中,不如将其移动到一个方法中,并在需要时调用它。