Как получить идентификатор объекта в прослушивателе NHibernate до его сохранения в базе данных? - PullRequest
4 голосов
/ 06 ноября 2010

У нас есть новое требование, согласно которому каждый объект должен иметь назначаемый пользователем идентификатор:

public class Entity
{
    public int ServerId { get; set; }
    public int UserId { get; set; }
}

. ServerId - это автоматически генерируемый идентификатор с использованием HiLo, а UserId определяется пользователем.Я БЫ.Однако, если пользователь НЕ устанавливает UserId, он должен по умолчанию принимать значение ServerId.Поэтому я создал слушателя следующим образом:

public class CustomEventListener : IPreInsertEventListener
{
    public bool OnPreInsert(PreInsertEvent @event)
    {
        var entity = @event.Entity as Entity;

        if (entity.UserId == 0)
        {
            entity.UserId = entity.ServerId;
        }

        return false;
    }
}

К сожалению, на этом этапе предварительной вставки ServerId всегда равен 0, поэтому UserId всегда равен 0. Кто-нибудь знает, как я могу получитьсгенерированный ServerId до сохраняется в базе данных, но после ServerId заполняется NHibernate?

PS Я также предполагаю, что это невозможнос генератором Identity, поскольку он сохраняет данные в базе данных, а затем получает идентификатор, используемый БД.Кто-нибудь может это подтвердить?

1 Ответ

3 голосов
/ 06 ноября 2010

Нашел решение благодаря записи в блоге Айенде здесь:

http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

Оказывается, вам нужно не только изменить его в сущности, но и в состоянии сущности:

public class CustomEventListener : IPreInsertEventListener
{
    public bool OnPreInsert(PreInsertEvent @event)
    {
        var entity = @event.Entity as Entity;

        if (entity.UserId == 0)
        {
            entity.UserId = entity.ServerId;
            Set(@event.Persister, @event.State, "UserId", entity.UserId);
        }

        return false;
    }

    private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
    {
        var index = Array.IndexOf(persister.PropertyNames, propertyName);
        if (index == -1)
            return;
        state[index] = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...