SQL Azureでは、レプリケーションのためにすべてのテーブルにクラスター化インデックスが必要なため(http://blogs.msdn.com/b/sqlazure/archive/2010/05/12/10011257.aspxを参照)、次のMsSqlAzureDialectをMsSqlConfigurationに追加しました。
public class MsSqlAzureDialect : MsSql2008Dialect
{
public override string PrimaryKeyString
{
get { return "primary key CLUSTERED"; }
}
}
しかし、それは私が現在多対多のテーブルで抱えている問題を解決しません。現在、ロールを持つユーザーとユーザーを持つロールがある状況があります。したがって、ユーザーとロールの間には多対多の関係があり、NHibernateによって生成されたリンクテーブルがあります。したがって、私のUserAutomappingOverrideには、次のようなものがあります。
public class UserAutomappingOverride : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
mapping.HasManyToMany(x => x.Roles).Cascade.SaveUpdate();
}
}
これにより、NHibernateはRoleToUserと呼ばれるリンクテーブルを作成します。ただし、このテーブルにはPKがないため、クラスター化インデックスはありません。これは、SQLAzureで使用するには無効なテーブル構成です。
私は次のように非流暢なNHibernateからのデータベースオブジェクトを使用しようとしました:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<nhibernate-mapping>
<database-object>
<create>create clustered index ix on RoleToUser(User_id, Role_id)</create>
<drop>drop index RoleToUser.ix</drop>
</database-object>
</nhibernate-mapping>
しかし、それは、流暢な構成でその非流暢なNHibernateコードを組み合わせようとする暗闇の中でのショットでした。ただし、「セキュリティ上の理由から、このXMLドキュメントではDTDが禁止されています...」というエラーが発生したため、機能しませんでした。
注:コードファーストデータベースの作成には、流暢なNHibernateを使用しています。そのため、実際にはエンティティとAutomappingOverridesを使用して、展開時にデータベースのスキーマを生成しています。
どんな助けでも大歓迎です。