NHibernate mapping - <database-object/>
I, like many, have grown used to NHibernate’s schema generation capabilities. Those make working with databases such a pleasure that I cannot imagine trying without them.
However, at some point, even NHibernate’s smarts reach an end, and such an occasion requires the use of direct SQL to manipulate the database directly. A good example of that would be:
<!-- SQL Server need this index -->
<database-object>
<create>
CREATE INDEX PeopleByCityAndLastName ...
</create>
<drop>
DROP INDEX PeopleByCityAndLastName
</drop>
<dialect-scope name="NHibernate.Dialect.MsSql2000Dialect"/>
<dialect-scope name="NHibernate.Dialect.MsSql2005Dialect"/>
<dialect-scope name="NHibernate.Dialect.MsSql2008Dialect"/>
</database-object>
<!-- Oracle need this stats only -->
<database-object>
<create>
CREATE STATISTICS PeopleByCityAndLastName ...
</create>
<drop>
DROP STATISTICS PeopleByCityAndLastName
</drop>
<dialect-scope name="NHibernate.Dialect.OracleDialect"/>
<dialect-scope name="NHibernate.Dialect.Oracle9Dialect"/>
</database-object>
As you can see, this allows us to execute database specific SQL, using the dialect scope. It is not a common feature, but it can be incredibly useful.