带有自定义不可编辑值的数据库字段
问题描述:
我对实体框架非常陌生,所以我没有弄清楚如何解决我的问题。我有一个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
如何移入单独的方法。在有多个依赖关系的情况下,这很有用:不要将逻辑嵌入到各个设置器中,最好将其移入方法中,并根据需要调用它。
谢谢@dasblinkenlight,我已经不了解这个概念。我已经经历了一些麻烦,可以为我的数据库映射字段,因为它没有setter,但现在一切都按预期工作:-) – 2013-05-13 21:06:59