尝试在get和set访问器中使用值的方法会产生.Net框架错误

时间:2014-12-26 17:12:22

标签: c# entity-framework poco

我试图在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; }

3 个答案:

答案 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); }
}

另一种方法是为此目的使用单独的类,例如SecureUserUserViewModel

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); }
    }
}