如何使用EntityFramework构建富域模型

时间:2011-11-04 04:03:41

标签: c# .net entity-framework orm

我正在使用Entity Framework 4.2(Code First)来创建我的数据库,到目前为止工作正常,但现在我面临的一个问题很容易在Hibernate或JPA中克服,但我不能在这里看到它。

我已经定义了一个User对象,它有一个名为Password的属性,我想自定义{get; set;}操作,以便在设置密码时有一定的逻辑(我想存储它的哈希版本,但是我想在我的域对象ala DDD中使用该逻辑。但我面临的是,当从数据库中实现一个对象时,我的setter被调用,而不是直接使用私有字段。

我正在尝试构建一个Rich Domain Object模型并避免使用DAO / Repository模式。

这是否可能通过实体框架,或者我将强制使用DAO /存储库模式。

下面是我的User对象的提取:

public class User
{
    [Key]
    public string LoginId { get; set; }

    [Required]
    private string password;

    public string Password
    {
        get { return password; }
        set {
            //Random Salt
            byte[] s;
            using (RNGCryptoServiceProvider prov = new RNGCryptoServiceProvider())
            {
                s = new byte[20];
                prov.GetBytes(s);
            }
            this.salt = Convert.ToBase64String(s);
            //Random salt                
            password = ComputeHash(value);
            }
    }

    [Required]
    private string salt;
    public string Salt { 
                         get { return this.salt; }
                         set { throw new InvalidOperationException("Salt is not an assignable property. Assign a password first to your model and a Salt will get created."); }
                       }

    public bool ValidatePassword(string clearTextPassword)
    {
        return this.Password == this.ComputeHash(clearTextPassword);
    }
    public string ComputeHash(string value)
    {
       ...
       return hashVersion of value;

    }

}

1 个答案:

答案 0 :(得分:0)

首先添加加密的passwordstring值对象(不可变)

例如

public class EncryptedString
{
  public string Value { get;private set; }
  public string Hash { get;private set; }
  bool Validate(string password);

  public Encrypted(string value)
  {
     // Put logic here
  }
}

在EF中,它被称为复杂类型