2

我需要創建包含INCLUDE列的非聚簇索引(請參閱下面的<create>標記)。這裏的映射文件:使用nhibernate映射文件創建具有「包含」列的封面索引

<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子句的用戶表部分的zipcode和所有其他列上使用單列索引。有沒有辦法使用映射文件或其他方式創建這種類型的索引?

這可能是一個長鏡頭,但不必指定每個列,而是查詢的INCLUDE部分中的索引...除了讓nhibernate將任何新列添加到索引作爲屬性添加到映射文件中。

回答

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>標籤。