由于 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,因此没有聚集索引。这是在 SQL Azure 中使用的无效表配置。
我尝试使用来自非流利 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...”
注意:我使用 fluent NHibernate 进行代码优先数据库创建。所以我实际上是在使用我的实体和 AutomappingOverrides 在部署时生成数据库的架构。
任何帮助将非常感激。