Добавить несопоставленные данные в NHibernate - PullRequest
1 голос
/ 25 августа 2011

У меня есть объект, который я пытаюсь сохранить в устаревшей базе данных с помощью NHibernate. У меня есть все соответствующие столбцы из таблицы, сопоставленной в моем доменном объекте, но есть несколько полей в таблице, которые должны быть заполнены для структуры устаревшей базы данных.

Следуя нескольким рекомендациям, я создал и зарегистрировал перехватчик NHibernate, чтобы сделать это для меня.

 public class CustomLineItemInterceptor : EmptyInterceptor
 {

  public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
  {
    var lineItem = entity as SomeCustomLineItem;

    if (lineItem == null)
    return false;


    List<string> propertyNameList = propertyNames.ToList();
    List<IType> typeList = types.ToList();
    List<object> stateList = state.ToList();

    propertyNameList.Add("Source");   // the unmapped column in the database
    typeList.Add(NHibernateUtil.String);
    stateList.Add("My Application's Name");  // the value I need to persist

    state = stateList.ToArray();
    propertyNames = propertyNameList.ToArray();
    types = typeList.ToArray();

    return true;
    }
}

Я смотрел на этот NHibernate добавить несопоставленный столбец в перехватчике и Несопоставленный столбцы в NHibernate? , не найдя ответа.

Я вижу, что метод OnSave срабатывает, но я ничего не храню в базе данных (или запросе SQL, сгенерированном NHibernate).

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

также существует этот подход с использованием виртуальных свойств и IPropertyAccessor.Я использовал его в одном из своих проектов в модели предметной области, и для меня легче объявить его один раз в сопоставлении, чем везде, где я открываю сеанс, что происходит в нескольких разных проектах (приложение, импорт, ETL, интеграция других программ)

1 голос
/ 26 августа 2011

Я не знаю много о том, как работают перехватчики NHibernate, но я не ожидал бы, что изменение переданных переменных массива фактически изменит что-либо внешнее по отношению к методу. Чтобы новые массивы заканчивались вне метода, они должны быть переданы по ссылочным (ref) параметрам.

Глядя на ваш первый связанный вопрос (добавьте неперекрытый столбец в перехватчике) , первое отличие, которое выпрыгивает, состоит в том, что в конце своего метода он вызывает базовый метод, передавая обновленные параметры (return base.OnSave(entity, id, state, propertyNames, types);). Возможно, это поможет?

...