web-dev-qa-db-ja.com

C#モデルのカスタムセッター

C#データモデルのカスタムセッターを作成する方法がわかりません。シナリオは非常に単純です。パスワードをSHA256関数で自動的に暗号化する必要があります。 SHA256関数は非常にうまく機能します(私は以前に何億ものプロジェクトで使用しました)。

私はいくつかのことを試しましたが、実行するとupdate-database再帰的に何かを実行しているようで、Visual Studioがハングします(エラーを送信しないでください)。モデルでパスワードをデフォルトで暗号化する方法を理解するのを手伝ってください。

私がすでに試したことを使ってコードを書く

public class Administrator
{
    public int ID { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public string Password
    {
        get
        {
            return this.Password;
        }

        set
        {
            // All this code is crashing Visual Studio

            // value = Infrastructure.Encryption.SHA256(value);
            // Password = Infrastructure.Encryption.SHA256(value);
            // this.Password = Infrastructure.Encryption.SHA256(value);
        }
    }
}

Seed

context.Administrators.AddOrUpdate(x => x.Username, new Administrator { Username = "admin", Password = "123" });
16
Stan

プライベートメンバー変数をバッキングフィールドとして使用する必要があります。これにより、値を個別に保存し、セッターで操作できます。

良い情報 ここ

public class Administrator
{
    public int ID { get; set; }

    [Required]
    public string Username { get; set; }

    private string _password;

    [Required]
    public string Password
    {
        get
        {
            return this._password;
        }

        set
        {  
             _password = Infrastructure.Encryption.SHA256(value);                
        }
    }
}
34
Chris Kooken

使用しているgetとsetは、実際にはget_Password()およびset_Password(password)と呼ばれるメソッドを作成します。

実際のパスワードをプライベート変数に保存する必要があります。したがって、これらの「メソッド」によって返され、更新されるプライベート変数を用意するだけで済みます。

public class Administrator
{
public int ID { get; set; }
[Required]
public string Username { get; set; }
[Required]
private string password;
public string Password
{
    get
    {
        return this.password;
    }

    set
    {
        this.password = Infrastructure.Encryption.SHA256(value);
    }
}
}