Я боролся с той же проблемой, что и автор темы (так как я комбинирую также Fluent NHibernate и Sql Azure), но данный ответ не удовлетворил.Это потому, что он не является динамическим по соглашению.Конечно, файл HBM может быть динамически создан и впоследствии добавлен в конфигурацию с помощью configuration.AddXmlFile("AddClusteredIndexesToManyToManyTables.hbm.xml");
, но мне просто не нравятся файлы HBM, и я не могу представить, что существует способ лучше .
Через несколько часов я нашел другое решение, которое является динамическим (и читаемым!) И не работает с файлами hbm xml.Решение состоит в следующем:
Предположение № 1: я создам составной первичный ключ для каждой соединительной таблицы, который приводит к кластеризованному индексу в SQL Server.
Послеконфигурация была собрана (таким образом, сопоставления проанализированы), (Свободно) NHibernate дает нам возможность взглянуть на фактические сопоставления с помощью configuration.ClassMappings
и configuration.CollectionMappings
.Последний используется потому, что нас интересуют сопоставления «многие ко многим».
foreach (var collectionMapping in configuration.CollectionMappings
// Filter on many-to-many
.Where(x => !x.IsOneToMany)) {
// Build the columns (in a hacky way...)
const string columnFormat = "{0}_id";
var leftColumn = new Column(string.Format(
columnFormat,
collectionMapping.Owner.MappedClass.Name));
var rightColumn = new Column(string.Format(
columnFormat,
collectionMapping.GenericArguments[0].Name));
// Fetch the actual table of the many-to-many collection
var manyToManyTable = collectionMapping.CollectionTable;
// Shorten the name just like NHibernate does
var shortTableName = (manyToManyTable.Name.Length <= 8)
? manyToManyTable.Name
: manyToManyTable.Name.Substring(0, 8);
// Create the primary key and add the columns
var primaryKey = new PrimaryKey {
Name = string.Format("PK_{0}", shortTableName),
};
primaryKey.AddColumn(leftColumn);
primaryKey.AddColumn(rightColumn);
// Set the primary key to the junction table
manyToManyTable.PrimaryKey = primaryKey;
}
И да, логика для получения левого и правого столбцов. После этого столбцы немного взломаны, но это работает иВы можете настроить и отредактировать мое решение (^ _-).Проблема в том, что отображение коллекции довольно пусто / не заполнено.
Удачи в кодировании и создании соглашений!