我在用户和 session 之间有一对多的父/子关系。这里是映射:
<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中有一个简单的方法来创建 session 关系:
public virtual UserSession LogInUser()
{
UserSession session = new UserSession() { ApplicationUser = this };
_userSessions.Add(session);
return session;
}
用户登录时,会发生多个数据库交互,这些交互被包装在事务中。除了创建新的用户 session 外,我还希望能够审核用户已登录,并将新的 session ID包含在审核数据中。但是,由于UserSession尚未持久,因此其ID为空。
我尝试保存ApplicationUser来生成用户 session ID:
IApplicationUserManager manager = ManagerFactory.GetApplicationUserManager();
ApplicationUser user = manager.GetById(userId);
user.LogInUser();
manager.Save(user);
我认为这将因为所有删除孤立级联设置而起作用,但事实并非如此。有没有办法在
Flush()
或事务提交之前强制生成ID?
最佳答案
有没有办法在Flush()或事务提交之前强制生成ID?
不。我将<generator class="assigned" />
用于UserSession类,并在类的构造函数中对其进行初始化。
另外,您可能需要三思而后行将密码公开为属性。
关于nhibernate - NHibernate:如何在亲子关系中强制生成 child 的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4391321/