Как сопоставить строковое свойство двоичному столбцу в базе данных? - PullRequest
1 голос
/ 02 июля 2011

У меня есть класс для объекта пользователя.Одним из свойств является пароль пользователя (на самом деле хеш).Я сделал это строкой (упорядоченный код):

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

Существует также отображение Fluent 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???
    }
}

Столбец базы данных имеет размер bytea тип данных на PostgreSQL.Приведенное выше отображение не работает, потому что свойство является строкой (текст).Что мне делать?

Ответы [ 2 ]

1 голос
/ 02 июля 2011

вы можете сделать Password публичным свойством, которое используется только для ссылки на базовое частное свойство HashedPassword.
как то так:
protected virtual byte[] /*or whatever the type is*/ HashedPassword {get; set;} public virtual string Password<br> get<br> {<br> return (string)(HashedPassword); //or however you want to cast it to string...<br> }<br> set<br> //...

затем вы можете сказать свободно nHib игнорировать ваше свойство Password.

0 голосов
/ 05 июля 2011

Вот окончательное решение, которое работает в обоих направлениях (чтение и запись), то, что я пробовал ранее, не работает должным образом. Надеюсь, это кому-нибудь поможет.

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[]>();
    }
}
...