使用nhibernate映射文件使用“Include”列创建封面索引

时间:2012-11-19 19:33:53

标签: sql-server-2008 nhibernate indexing nhibernate-mapping non-clustered-index

我需要使用INCLUDE列创建非聚集索引(请参阅下面的<create>标记)。这是映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MyApp" assembly="MyApp">
  <class name="User" table="user" >
    <id name="Id" type="Guid" column="user_id">
      <generator class="guid.comb"/>
    </id>

    <property name="Name" column="name" not-null="true"  />
    <property name="Phone" column="phone" />
    <property name="Zipcode" column="zipcode" />
  </class>

  <database-object>
    <create>
      CREATE NONCLUSTERED INDEX [IX_user_zipcode_id]
      ON User (Zipcode)
      INCLUDE (Name, Phone)
    </create>
    <drop>
      DROP INDEX IX_user_zipcode_id
    </drop>
    <dialect-scope name="NHibernate.Dialect.MsSql2000Dialect"/>
    <dialect-scope name="NHibernate.Dialect.MsSql2005Dialect"/>
    <dialect-scope name="NHibernate.Dialect.MsSql2008Dialect"/>

  </database-object>

</hibernate-mapping>

我遇到的问题是根本没有创建索引。似乎没有发生任何事情。这是我第一次使用<database-object>,所以我可能在这里做错了。

我猜测INCLUDE是特定于Sql Server的,这就是方言范围存在的原因。我知道如何创建单列和多列索引,但这不是我想要的。我想要一个zipcode的单列索引和查询的INCLUDE子句的User表部分中的所有其他列。有没有办法使用映射文件或其他方式创建这种类型的索引?

这可能是一个很长的镜头,但是不必在查询的INCLUDE部分中指定每个列而是索引的那个列是很好的...而是让nhibernate将任何新列添加到索引中作为属性添加到映射文件。

1 个答案:

答案 0 :(得分:1)

问题的一部分确实是我对database-object标签缺乏了解,主要原因是文档质量差。根据我收集的内容,<create><drop>代码仅在使用SchemaExport时使用:

    Dim schemaExport As SchemaExport = New SchemaExport(NhibernateConfiguration)
    schemaExport.Execute(False, True, False)

我的应用不会使用该类创建架构。相反,它使用SchemaUpdate,因此架构不会每次都被吹走(数据库可能已存在于用户计算机上):

    Dim schemaUpdate As SchemaUpdate = New SchemaUpdate(NhibernateConfiguration)
    schemaUpdate.Execute(False, True)

这就是问题所在。下一个要问的逻辑问题是如何使用SchemaUpdate执行sql。答案......你做不到。请参阅此帖子:https://forum.hibernate.org/viewtopic.php?f=6&t=969584&view=next

唉,我只能使用原始sql。也许有一天他们会添加<update>标记。