NHibernate: Как заставить ID поколения ребенка в отношениях родитель / ребенок - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть отношение один-ко-многим родитель / потомок между пользователем и сеансом.Вот сопоставления:

<class name="ApplicationUser" table="APPLICATION_USER" lazy="true">
    <id name="Id" column="APPLICATION_USER_ID">
         <generator class="guid.comb" />
    </id>
    <property name="UserName" column="USER_NAME" />
    <property name="Password" column="PASSWORD" />
    <bag name="UserSessions" lazy="true" cascade="all-delete-orphan" inverse="true">
        <key column="APPLICATION_USER_ID"></key>
        <one-to-many class="UserSession"></one-to-many>
    </bag>
</class>

<class name="UserSession" table="USER_SESSION" lazy="true">
    <id name="Id" column="USER_SESSION_ID">
         <generator class="guid.comb" />
    </id>
    <property name="Created" column="CREATED" />
    <many-to-one name="ApplicationUser" column="APPLICATION_USER_ID" class="ApplicationUser" unique="true" />
</class>

У меня есть простой метод в ApplicationUser, который создает отношение сеанса:

public virtual UserSession LogInUser()
{
    UserSession session = new UserSession() { ApplicationUser = this };
    _userSessions.Add(session);
    return session;
}

Когда пользователь входит в систему, происходит несколько взаимодействий базы данных,завернутый в транзакцию.Помимо создания нового пользовательского сеанса, я хочу иметь возможность проверять, вошел ли пользователь в систему, и включать новый идентификатор сеанса в данные аудита.Однако, поскольку UserSession еще не был сохранен, его идентификатор пуст.

Я попытался сохранить ApplicationUser для генерации идентификатора сеанса пользователя:

IApplicationUserManager manager = ManagerFactory.GetApplicationUserManager();
ApplicationUser user = manager.GetById(userId);

user.LogInUser();
manager.Save(user);

Я думал, что это будет работать, потому чтокаскада «полностью удалить сироту», но это не так.Есть ли способ принудительно генерировать ID перед Flush() или фиксацией транзакции?

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Есть ли способ принудительно генерировать ID перед Flush () или фиксацией транзакции?

Нет. Я бы использовал <generator class="assigned" /> для класса UserSession и инициализировал бы его в конструкторе класса.

Кроме того, вам может понадобиться дважды подумать о предоставлении пароля как свойства.

0 голосов
/ 09 декабря 2010

Вызов Session.Save (это, кстати, сессия NHibernate) должен сгенерировать идентификатор.Это одна из основных причин использования Guids - они могут быть созданы без обращения к базе данных.

Если сохранение не происходит каскадно из ApplicationUser, вам просто нужно вручную передать UserSession в Session.Save.Я не понимаю, почему это может быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...