nHibernate, отображающийся на пользовательские типы

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

// Validation rules ...
$rules = [
    ...
    'occupation' => 'required',
    ...
];
13
задан Craig 28 October 2008 в 02:07
поделиться

1 ответ

Необходимо реализовать собственный IUserType.

Посмотрите это сообщение в блоге для деталей. Я также вставлю соответствующий раздел ниже в случае, если блог исчезает.

В NHibernate пользовательский тип отображения является классом, который происходит или из интерфейсов IUserType или из ICompositeUserType. Эти интерфейсы содержат несколько методов, которые должны быть реализованы, но в наших целях здесь, мы собираемся сфокусироваться на 2 из них. Рассмотрите следующее.

  public class TypeClassUserType : IUserType
  {


    object IUserType.NullSafeGet(IDataReader rs, 
      string[] names, 
     object owner) {

     string name = NHibernateUtil.String.NullSafeGet(rs, 
     names[0]) as string;

     TypeClassFactory factory = new TypeClassFactory();
     TypeClass typeobj = factory.GetTypeClass(name);
     return typeobj;
   }

    void IUserType.NullSafeSet(IDbCommand cmd, 
    object value, 
     int index) {

      string name = ((TypeClass)value).Name;
     NHibernateUtil.String.NullSafeSet(cmd, name, index);
    }
  }

Создав этот класс, я могу теперь явно отобразить ассоциацию между ActualClass и TypeClass как простое свойство на отображении ActualClass.

<property
  name="Type"
  column="TypeName"
  type="Samples.NHibernate.DataAccess.TypeClassUserType, 
        Samples.NHibernate.DataAccess" />

Поскольку NHibernate находится в процессе сохранения экземпляра ActualType, это загрузит и создаст новый экземпляр TypeClassUserType и назовет метод NullSafeSet. Как Вы видите от тела метода, я просто извлекаю имя из отображенного свойства (передал в как параметр, передаваемый по значению), и определение извлеченного имени как значение параметра, который будет установлен в базе данных. Конечный результат состоит в том, что, хотя свойством Type ActualClass является TypeClass в модели предметной области, только свойство Name объекта TypeClass хранится в базе данных. Обратное также верно. Когда NHibernate загружает экземпляр ActualType от базы данных и находок свойство моего пользовательского типа отображения, это загружает мой пользовательский тип и называет метод NullSafeGet. Как Вы видите, мой метод завоевывает репутацию от возвращенных данных, называет мою фабрику в наилегчайшем весе для получения корректного экземпляра TypeClass и затем на самом деле возвращает тот экземпляр. Процесс разрешения типа происходит прозрачно с моими классами доступа к данным (и даже с самим NHibernate в этом отношении).

18
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: