2011-11-04 66 views
2

使用Entity Framework 4.2(代码优先)创建我的数据库,目前工作正常,但现在我面临的问题很容易在Hibernate或JPA中克服,但我不是能够在这里看到它。如何使用EntityFramework构建丰富域模型

我已经定义了一个User对象,它具有一个名为Password的属性,我想定制{get; set;}操作以在设置密码时拥有某些逻辑(我想存储它的哈希版本,但我想在我的域对象阿拉德DDD逻辑)。但即时通信面临的情况是,从数据库实现对象时,我们的setter被调用并且不直接使用私有字段。

我试图建立一个富域对象模型,并避免DAO/Repository模式。

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

下面是我的用户对象的提取:

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; 

    } 

}

+0

我忍不住想说这个答案:“为了构建一个丰富的DM,你首先需要一个丰富的领域。 Aquire this,你将在所有的事情上都取得成功' – Jeremy

+0

感谢你的想法,我只是举了一个很短的例子,或者我只是用了错误的措辞(丰富的DM),但把它放在一边,回到原来的位置题。在EntityFramework中是否可以自定义{get; set;}并让EntityFramework直接将其逻辑映射到私有字段,而不要调用公共属性? – jcgarciam

+0

我发现了以下内容:(如何在“getter”或“setter”之后编写自定义逻辑?)但在本文的链接中会引发404 :(http://blogs.msdn.com/b/dsimmons/archive/ 2008/08/10/EF-FAQ-实体classes.aspx – jcgarciam

回答

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它被称为复合型