1

我有一个用户实体的类。其中一个属性是用户的密码(实际上是一个散列)。我做了一个字符串(精简代码):如何将字符串属性映射到数据库中的二进制列?

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Password { get; set; } 
} 

还有一个功能NHibernate映射(精简代码):

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("users"); 
     Id(x => x.Id).GeneratedBy.Sequence("users_id_seq"); 
     Map(x => x.Password); // what do I put here??? 
    } 
} 

数据库字段上的PostgreSQL bytea数据类型。上述映射不起作用,因为该属性是字符串(文本)。我该怎么办?

回答

1

您可以将Password作为公共财产,仅用于参考底层私有财产HashedPassword
像这样:
protected virtual byte[] /*or whatever the type is*/ HashedPassword {get; set;} public virtual string Password
get
{
return (string)(HashedPassword); //or however you want to cast it to string...
}
set
//...

然后你可以告诉流利nHib忽略你的密码属性。

+0

我做了一个有点不同:http://www.pastie.org/2162631 但它在同一直线上的。这个想法来自[这里](http://wiki.fluentnhibernate.org/Fluent_mapping_private_properties) 谢谢! –

0

这里是最终的解决方案,这两种方式(阅读&写),我以前尝试没有正常工作。希望这会有助于某人。

public class User 
{ 
    private byte[] _password; 

    public virtual int Id { get; private set; } 

    public virtual string Password 
    { 
     get { return System.Text.Encoding.Unicode.GetString(_password); } 
     set { _password = System.Text.Encoding.Unicode.GetBytes(value); } 
    } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("users"); 
     Id(x => x.Id).GeneratedBy.Sequence("users_id_seq"); 
     Map(x => x.Password) 
      .Access.LowerCaseField(Prefix.Underscore) 
      .CustomType<byte[]>(); 
    } 
} 
相关问题