NHibernate:如何在父/子关系中强制生成子ID

时间:2010-12-08 19:14:59

标签: nhibernate identity one-to-many

我在用户和会话之间有一对多的父/子关系。以下是映射:

<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?

2 个答案:

答案 0 :(得分:1)

  

有没有办法在Flush()或事务提交之前强制生成ID?

没有。我会将<generator class="assigned" />用于UserSession类并在类的构造函数中初始化它。

此外,您可能需要考虑将密码作为属性公开。

答案 1 :(得分:0)

调用Session.Save(这是NHibernate的Session btw)应该生成ID。这是使用Guids的主要原因之一 - 它们可以在不进入数据库的情况下生成。

如果保存没有从ApplicationUser级联,您只需手动将UserSession传递给Session.Save。我不明白为什么这会是一个问题。