我在用户和会话之间有一对多的父/子关系。以下是映射:
<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;
}
当用户登录时,会发生多个数据库交互,包含在事务中。除了创建新用户会话之外,我还希望能够审核用户已登录,并将新会话ID包含在审计数据中。但是,由于UserSession尚未保留,因此其ID为空。
我尝试保存ApplicationUser以生成用户会话ID:
IApplicationUserManager manager = ManagerFactory.GetApplicationUserManager();
ApplicationUser user = manager.GetById(userId);
user.LogInUser();
manager.Save(user);
我认为这会因为全删除 - 孤立级联设置而起作用,但事实并非如此。有没有办法在Flush()
或事务提交之前强制生成ID?
答案 0 :(得分:1)
有没有办法在Flush()或事务提交之前强制生成ID?
没有。我会将<generator class="assigned" />
用于UserSession类并在类的构造函数中初始化它。
此外,您可能需要考虑将密码作为属性公开。
答案 1 :(得分:0)
调用Session.Save(这是NHibernate的Session btw)应该生成ID。这是使用Guids的主要原因之一 - 它们可以在不进入数据库的情况下生成。
如果保存没有从ApplicationUser级联,您只需手动将UserSession传递给Session.Save。我不明白为什么这会是一个问题。