2

我需要创建一个包含 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 的,这就是方言范围存在的原因。我知道如何创建单列和多列索引,但这不是我想要的。我想要在查询的 INCLUDE 子句的用户表部分中的邮政编码和所有其他列上的单列索引。有没有办法使用映射文件或其他方式创建这种类型的索引?

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

4

1 回答 1

1

所以问题的一部分确实是我对标签缺乏理解,database-object主要是由于文档不足。根据我收集的信息,<create>and<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. 答案……你不能。看到这篇文章:https ://forum.hibernate.org/viewtopic.php?f=6&t=969584&view=next

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

于 2012-11-26T20:19:02.870 回答