NHibernate: вставить объект со значением идентификатора, установленным в другом столбце.

Возможно ли с помощью NHibernate и Sql Server вставить объект и установить одно из значений столбца для вновь созданного идентификатора?

В чистом sql я могу сделать это, добавив значение по умолчанию

Создайте таблицу:

create table Test
   id int identity,
   name varchar(12),
   parentId int NOT NULL

Добавьте ограничение:

alter table Test constraint ... default ident_current('Test') for parentId

И после этого пропустите parentId или используйте ключевое слово DEFAULT:

insert into Test values('TEST')
insert into Test values('TEST', DEFAULT)

Поправьте меня, если я ошибаюсь, но я думаю, что приведенные выше утверждения никогда не будут сгенерированы NHibernate?

На данный момент я сначала сохраняю свою сущность, а затем обновляю ее с помощью вновь созданной личности. Этот случай тормозит структуру db, так как мне пришлось заставить этот конкретный столбец принимать значения NULL.

Сначала я думал, что это будет легко, но сейчас, спустя несколько часов, я все еще не могу найти ответ :/

заранее спасибо


person MonkeyCoder    schedule 23.03.2011    source источник


Ответы (1)


Это можно сделать с помощью сгенерированного атрибута в сопоставлении свойств. Для значений по умолчанию, установленных базой данных, используйте generated="insert". Для отображения Fluent NHibernate используйте .Generated().Insert().

РЕДАКТИРОВАТЬ:

public class Test
{
    private Test _parent;

    public Test()
    {
        _parent = this;
    }

    public Test Parent
    {
        get { return _parent == this ? null : _parent; }
        set { _parent = value ?? this; }
    }
}
person Jamie Ide    schedule 23.03.2011
comment
Привет, Джейми, спасибо за информацию об атрибуте, но я предполагаю, что это означает, что после установки generate=insert я не смогу явно указать свое значение без обновления объекта? - person MonkeyCoder; 23.03.2011
comment
Я не знаю. Если я понимаю проблему, вы хотите, чтобы родитель по умолчанию был таким же, как и объект, но, конечно, вы также должны иметь возможность установить родителя. Я отредактирую свой ответ, чтобы показать, как я справляюсь с этим сценарием. - person Jamie Ide; 23.03.2011