2011-11-04 1 views
2

Im using Entity Framework 4.2 (code d'abord) pour créer ma base de données, qui fonctionne bien jusqu'ici, mais maintenant je suis confronté à un problème qui est très facile à surmonter dans Hibernate ou JPA mais im pas capable de le voir ici. J'ai un objet Utilisateur qui a une propriété appelée Mot de passe, je veux personnaliser les opérations {get; set;} pour avoir une certaine logique lors de la définition du mot de passe (je veux en stocker une version de hachage, mais je veux cette logique à l'intérieur de mon objet de domaine al DDD). Mais je suis confronté à cela lors de la matérialisation d'un objet de la base de données mon setter est appelé et n'utilise pas directement le champ privé. J'essaye de construire un modèle d'objet de domaine riche et d'éviter le modèle DAO/Repository sur ceci. Est-ce possible grâce à Entity Framework, ou serai-je forcé d'utiliser des modèles DAO/Repository.Comment construire un modèle de domaine riche avec EntityFramework

est ci-dessous une extraction de mon objet Utilisateur:

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

Je ne pouvais pas m'empêcher de penser à dire ceci comme la réponse: 'Pour construire un DM riche, vous devez d'abord avoir un domaine riche. Aquire ceci et vous aurez du succès dans tout ce que vous faites – Jeremy

+0

Merci pour votre pensée, je viens de mettre un très court exemple ou peut-être que j'utilise juste le mauvais libellé (DM riche), mais en mettant de côté et de revenir à l'original question. Est-il possible dans EntityFramework de personnaliser le {get; set;} et EntityFramework mappe-t-il leur logique au champ privé directement et n'appelle pas la propriété publique? – jcgarciam

+0

J'ai trouvé ce qui suit: (Comment écrire la logique personnalisée derrière un "getter" ou "setter"?) À mais les liens dans l'article jette 404 :(http://blogs.msdn.com/b/dsimmons/archive/ 2008/08/10/ef-faq-entity-classes.aspx – jcgarciam

Répondre

0

Commencez par l'ajout d'un objet de valeur de passwordstring cryptée (immuable)

par exemple

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

En EF est appelé un type complexe

Questions connexes