У меня есть отношение один-ко-многим родитель / потомок между пользователем и сеансом.Вот сопоставления:
<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()
или фиксацией транзакции?