具有自定义不可编辑值的数据库字段
本文关键字:数据库 字段 编辑 自定义 | 更新日期: 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中,不如将其移动到一个方法中,并在需要时调用它。