我试图在set / get访问器中使用实体框架生成的类的属性中的一些方法。目的是在保存到DB之前加密字段并在从DB读取之前解密字段。我在POCO类级别进行加密,以便在与DB本身交互时发生加密 - 解密,我不必通过大量的码。 POCO类是最好的接口吗? 代码构建成功,但是当我执行代码时出现.Net Framework错误,最终终止了visual studio进程。
我不确定,我可能会犯一些非常基本的错误,但是无法解决这个问题。任何建议将不胜感激!
[Table("Users")]
public class User
{
[Key]
[Required]
public Int32 UserID { set; get; }
[Required]
[MaxLength(50)]
public String UserName // This is where I am using encryption decryption methods
{
set
{
this.UserName = NewEncryptionMethod(value);
}
get
{
return NewDecryptionMethod(this.UserName);
}
}
[Required]
public Int32 CustID { set; get; }
答案 0 :(得分:1)
它现在失败的原因是因为你正试图抓住get
UserName
部分{{1}}部分,因为你正试图抓住它通过尝试获取值并对其进行解密来获取该值。这最终会导致溢出错误。
您的解决方案是将记录保留在数据库中,将它们带过来,然后使用包含解密数据的ViewModel类。如果要返回数据库,只需加密ViewModel中的值并将该值推送到数据库即可。
答案 1 :(得分:1)
我不是说你做这项工作的方式很好,我可以说的第一件事就是你有无限的递归电话。
解决方案:
private string _username;
[Required]
[MaxLength(50)]
public String UserName // This is where I am using encryption decryption methods
{
set
{
_username = NewEncryptionMethod(value);
}
get
{
//you have to deal with a null username here is a bad but quick solution
_username = _username ?? string.Empty;
return NewDecryptionMethod(_username);
}
}
答案 2 :(得分:1)
您可以保留UserName原始的不安全数据。但要将此属性设为内部。
// map me
internal string UserName { get; set; }
使用其他属性保护它,但公开:
// don't map me
public string SecureUserName
{
get { return Encrypt(UserName);
set { UserName = Encrypt(value); }
}
另一种方法是为此目的使用单独的类,例如SecureUser
或UserViewModel
:
public class SecureUser
{
private readonly User _user;
public SecureUser(User user)
{
_user = user;
}
public string UserName
{
get { return Encrypt(_user.UserName);
set { _user.UserNAme = Decrypt(value); }
}
}