Как NHibernate может использовать значение базы данных по умолчанию при сохранении нового объекта? - PullRequest
5 голосов
/ 14 июля 2009

Рассмотрим следующий простой класс C #:

public class Entity
{
    public Entity() { }
    public virtual int Id { get; private set; }
    public virtual DateTime DateCreated { get; private set; }
}

Отображается с помощью следующего простого сопоставления NHibernate:

<class name="Entity" mutable="false">
    <id name="Id">
        <generator class="native">
    </id>
    <property name="DateCreated"/>
</class>

К следующей простой схеме базы данных:

CREATE TABLE Entity (
    Id int IDENTITY(1,1) PRIMARY KEY,
    DateCreated datetime NOT NULL DEFAULT getUtcDate()
)

Когда вы создаете новый экземпляр Entity и сохраняете его в базу данных, как вы предписываете NHibernate использовать значение базы данных по умолчанию для столбца DateCreated, если его значение равно null? В качестве альтернативы, как я могу указать, что NHibernate должен использовать результат функции getUtcDate() в качестве значения для поля DateCreated после вставки?

Хотя я мог бы легко добавить

DateCreated = DateTime.Now;

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

Ответы [ 2 ]

4 голосов
/ 14 июля 2009

Вы можете указать, что свойство генерируется базой данных:

NHibernate Mapping - свойство

Так что для вашего случая вы хотели бы указать:

generated="insert"

Таким образом, NHibernate узнает, что после INSERT ему придется обновить сущность, но после обновления DateCreated не изменится.

Возможно, вам также потребуется указать:

update="false" insert="false"

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

1 голос
/ 09 ноября 2011

У меня была похожая проблема. Мне пришлось добавить атрибут dynamic-insert="true" в мое отображение классов.
Из документации:

dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...