Свободная конфигурация nHibernate для нестандартного типа

Я пытаюсь сопоставить fNH с пользовательским типом, но у меня возникают трудности.

Я хочу, чтобы fNH присваивал свое значение через интерфейс настраиваемому типу. Мне также нужен nHibernate, чтобы сохранить экземпляр настраиваемого типа в сущности. Он всегда будет создаваться при доступе к свойству, не перезаписывайте экземпляр, просто установите значение в оболочке.

Когда я пытаюсь выполнить приведенное ниже сопоставление, возникает исключение «Не удалось найти средство получения для свойства Value» в классе Entities.User »

Идеи?

Сопоставление fNH:

Map(x =>((IBypassSecurity<string>)x.SecuredPinNumber).Value,"[PinNumber]");

Пример домена:

public class User
{
 public SecureField<string> SecuredPinNumber {get;private set;}
}

public class SecureField<T> : IBypassSecurity<T>
{
 public T Value { get; set; } // would apply security rules, for 'normal' use
 T IBypassSecurity<T>.Value {get;set;} // gets/sets the value directy, no security.
}

// allows nHibernate to assign the value without any security checks
public interface IBypassSecurity<T>
{
 T Value {get;set;}
}



Ответы (1)


Метод Map () - это построитель выражений для извлечения имен свойств в виде строк. Таким образом, ваше отображение сообщает NH, что вы хотите отобразить свойство «Value» в классе User, которого, конечно же, не существует. Если вы хотите использовать свой собственный тип, прочтите справочную документацию NH об этом и используйте метод CustomType () в своем сопоставлении.

Вы также можете использовать защищенное свойство для PinNumber, которое обеспечивает прямой доступ.

public class User
{
    protected virtual string PinNumber { get; set; }  // mapped for direct access
    public string SecuredPinNumber
    {
        get { /* get value with security checks */ }
        set { /* set value with security checks */ }
    }
}

Вы можете прочитать сообщение о сопоставлении защищенных свойств с помощью Fluent.

person rumpelstiefel    schedule 24.06.2012
comment
спасибо за ссылку на пост. Что касается использования CustomType, я рассмотрел пример, и, судя по внешнему виду примера, он создает новый экземпляр типа SecureField ‹T› и возвращает его, чего я не хочу. Есть ли способ избежать этого? - person jasper; 24.06.2012