我需要使用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将任何新列添加到索引中作为属性添加到映射文件。
答案 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>
标记。