Как заставить значения по умолчанию для сопоставления свойств применяться при вставках с использованием Fluent NHibernate

#nhibernate #fluent-nhibernate #nhibernate-mapping

#nhibernate #fluent-nhibernate #nhibernate-сопоставление

Вопрос:

У меня есть это сопоставление: Map(x => x.FileAs).Длина (200).Default(«»).Not.Nullable();

Схема базы данных уже существует, и столбец не допускает нулей и не имеет значения по умолчанию. Изменение текущей базы данных не является вариантом.

Можно ли настроить NHibernate для установки значений по указанному умолчанию во время вставки, если текущее значение равно null?

Документация для Fluent NHibernate чрезвычайно краткая… И мои поиски до сих пор не указали, возможно ли это или нет.

Спасибо, Аарон

Ответ №1:

Вы не можете заставить NHibernate устанавливать значения по умолчанию. Default("") сопоставления in влияют только на схему БД, которая может быть сгенерирована NHibernate.

Если вам нужно применить какое-либо значение по умолчанию для свойства в объектах, почему бы вам не сделать это в конструкторе?

Комментарии:

1. В этом случае значения считываются из другого источника, где они могут быть нулевыми. И было бы чище сохранить сопоставление на стороне сервера, включая значения по умолчанию, вместе в одном классе конфигурации сопоставления.

Ответ №2:

Да, я верю, что вы можете. Вы должны проверить следующее в своих сопоставлениях:

(7) динамическое обновление (необязательно, значение по умолчанию равно false): указывает, что UPDATE SQL должен генерироваться во время выполнения и содержать только те столбцы, значения которых изменились.

(8) динамическая вставка (необязательно, значение по умолчанию равно false): указывает, что ВСТАВКА SQL должна быть сгенерирована во время выполнения и содержать только столбцы, значения которых не равны null.

Выше было взято отсюда: http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-class

Беглый пример:

 public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        DynamicInsert();
        DynamicUpdate();
        Table("ORDER");
        Id(x => x.OrderId, "ORDER_ID");
    }
}
  

Комментарии:

1. К сожалению, это приведет к полному игнорированию свойства, поскольку оно равно null, и база данных будет жаловаться, что оно не может быть null. Я бы хотел, чтобы NHibernate при вставке включал столбец со значением по умолчанию, когда он видит, что это null.

2. Для этого и нужны значения по умолчанию для базы данных! Если NHibernate не включает его во вставку, по умолчанию будет использоваться значение по умолчанию для базы данных.

3. Я также обнаружил, что Map(x => Order. Подробности). Длина (500) не обрезает текст, где базовым столбцом базы данных является ntext. Так же как и NHibernate обеспечивает преобразование данных. Могу ли я зарегистрировать класс преобразователя данных для столбца? Конечно, все это в базе данных лучше, но в некоторых случаях требуется преобразование, и я бы хотел, чтобы это было расширение сопоставления, а не совершенно другая система.

4. Да, все данные в файлах сопоставления, такие как Length() и Default(), предназначены только для генерации скрипта базы данных. На самом деле эти правила не применяются к вашим объектам.