Asp.net mvc 有人能帮我理解为什么使用NHibernate时自动标识(int)不好吗?

Asp.net mvc 有人能帮我理解为什么使用NHibernate时自动标识(int)不好吗?,asp.net-mvc,nhibernate,Asp.net Mvc,Nhibernate,我已经看到了很多关于使用Guid而不是int的评论(从NHibernate的角度来看),其结论是使用auto-identity打破了UoW模式 有一个简短的问题描述,但它并没有真正告诉我“为什么”它打破了模式(除非我误解了可能的情况) 有人能给我一些启发吗?我认为关键的突破因素是,获取自动递增的值需要实际写入数据库,而nHibernate可能会延迟或可能永远不会执行该操作。有几个主要原因 使用Guid可以跨多个数据库识别单个实体,包括六个具有相同模式但不同数据的关系数据库、一个文档数据库等。当

我已经看到了很多关于使用Guid而不是int的评论(从NHibernate的角度来看),其结论是使用auto-identity打破了UoW模式

有一个简短的问题描述,但它并没有真正告诉我“为什么”它打破了模式(除非我误解了可能的情况)


有人能给我一些启发吗?

我认为关键的突破因素是,获取自动递增的值需要实际写入数据库,而nHibernate可能会延迟或可能永远不会执行该操作。

有几个主要原因

  • 使用
    Guid
    可以跨多个数据库识别单个实体,包括六个具有相同模式但不同数据的关系数据库、一个文档数据库等。当您有多个单独的数据存储位置时,这一点就变得很重要—这也意味着您的案例:您有一个dev数据库一个产品数据库,对吗

  • 使用
    Guid
    使NHibernate能够将更多语句批处理在一起,在工作/事务单元的最后执行更多的数据库工作,并减少到数据库的往返总次数,从而提高性能并带来其他好处

评论:

Random
Guid
s不会创建较差的索引—从本机上讲,它们创建较差的聚集索引。有两种解决方案

  • 使用部分顺序的
    Guid
    。对于NHibernate,这意味着使用
    Guid.comb
    id生成器,而不是
    Guid
    id生成器。
    Guid.comb
    是部分顺序的,具有良好的性能,但保留了非常高的随机性

  • 让您的
    Guid
    主键成为
    非聚集的
    索引,并将聚集索引放在另一个自动递增列上。您可以决定映射此列,在这种情况下,您将失去更好的批处理和更少的往返的好处,但您将重新获得易于放入URL的短数字的所有好处。或者您可以决定de不映射此列并将其完全保留在数据库中,在这种情况下,
    Guid
    s作为主键可以获得更好的性能,而NHibernate的往返次数更少也可以获得更好的性能


使用标识,在父子场景中,数据库对数据库进行往返以获取父级ID,以便正确关联子级。这意味着此时必须提交父级。如果子级出现问题,则需要删除父级以正确退出UoW

但是非顺序GUID将创建较差的索引,有没有好的方法来处理这个问题?