代码之家  ›  专栏  ›  技术社区  ›  NotDan

保存时的NHibernate冲洗模式

  •  4
  • NotDan  · 技术社区  · 16 年前

    我已将nHibernate会话的FlushMode属性设置为FlushMode。从不,但当我调用session.save(user)时,仍会调用数据库。这是应该怎么做的吗?我认为在调用flush()之前不应该进行插入。

    编辑: 我发现了这个问题,我把主键改成了guid,它起作用了。是否有其他类型(即没有guid主键)可以工作?我宁愿要一个数字而不是一个guid…

    3 回复  |  直到 15 年前
        1
  •  8
  •   Jorge Alves    15 年前

    你用的是本地生成器,对吗?

    问题在于,由于ID是由DB生成的,所以nhibernate需要往返一次才能获取ID。例如,对于服务器的标识字段,必须在scope_identity()返回有效键之前执行实际的insert语句。唯一安全地执行此操作的方法是刷新会话。

    作为guid和标识的替代方案,您可以尝试“增量”生成器,看看它是否适合您的需要: http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html#mapping-declaration-id-generator

    您应该知道,如果您集群应用程序,或者在同一个表中插入其他进程或应用程序,这种方法是不可行的。

    PS:欲了解更多信息,请尝试 http://unhandled-exceptions.com/blog/index.php/2008/12/11/on-choosing-an-identity-type/

        2
  •  1
  •   NotDan    16 年前

    我发现了这个问题,我用一个身份作为主键。将其更改为guid有效。

        3
  •  0
  •   sirrocco    15 年前

    尝试在事务中包装会话.save(user),并将flushmode设置为commit。

    这样可以确保不会对数据库进行任何调用。