Я пытаюсь использовать свободный nHibernate для отображения класса, который существует только как контейнер для других классов и не имеет собственного идентификатора. Но я хочу, чтобы идентификатор класса был другим классом. Это действительно не имеет смысла, это может быть проще объяснить на примере структуры данных.
abstract QueryBuilder
{
public IEnumerable<string> Category1Keys {get; set;}
public IEnumerable<int> Category2Ids {get; set;}
public IEnumerable<int> Category3Ids {get; set;}
}
Set
{
public int Id {get; set;}
public string Name {get; set;}
public SetQueryBuilder QueryBuilder{get; set;}
}
SetQueryBuilder : QueryBuilder
{
}
News
{
public int Id {get; set;}
public string Name {get; set;}
public NewsQueryBuilder QueryBuilder{get; set;}
}
NewsQueryBuilder : QueryBuilder
{
}
Теперь QueryBuilder - это имя, которое мы используем для отображения различных (не связанных) предметов в одни и те же категории. Итак, что может использовать QueryBuidler: новости, страницы, разрешения.
Поскольку все различные элементы, которые используют QueryBuilder, отображают эти отношения одинаково, и иногда мы фактически используем параметры одного типа QueryBuilder в качестве критерия выбора для другого типа QueryBuilder (т. Е. Если новости имеют QB из A, получить все наборы, которые соответствуют одним и тем же критериям), я хочу иметь абстрактный класс QueryBuilder, а затем расширить его для всех вещей, которые имеют сопоставления для всех категорий.
Вот пример Set DB для построителя запросов. В БД нет фактического элемента для QueryBuilder - он состоит из всей информации из таблиц объединения классов.
f_set
{
set_id (PK, int)
name (varchar)
}
f_set_cat1
{
set_id (PK, FK, int)
cat1_key (PK, FK, char(3))
}
f_set_cat2
{
set_id (PK, FK, int)
cat2_id (PK, FK, int)
}
f_set_cat3
{
set_id (PK, FK, int)
cat3_id (PK, FK, int)
}
Моя проблема заключается в том, как сопоставить каждый экземпляр класса QueryBuilder в nHibernate, так как он не имеет реального ключа или записи таблицы. Я хотел бы сказать, что Id является ссылкой на Set, который используют все отображения категорий .
Вот мои беглые отображения:
SetMapping : ClassMap<Set>
{
public SetMapping()
{
Schema("cam");
Table("f_set");
Id(x => x.Id, "f_set_id").GeneratedBy.Identity();
Map(x => x.Name, "name").Not.Nullable();
HasOne<SetQueryBuilder>(x => x.QueryBuilder);
}
}
SetQueryBuilderMapping : ClassMap<SetQueryBuilder>
{
public SetQueryBuilderMapping()
{
References(x => x.Set, "set_id");
HasMany(x => x.Category1Keys).Table("f_set_cat1").Element("cat1_key").KeyColumn("set_id");
HasMany(x => x.Category2Ids).Table("f_set_cat2").Element("cat2_id").KeyColumn("set_id");
HasMany(x => x.Category2Ids).Table("f_set_cat3").Element("cat3_id").KeyColumn("set_id");
}
}
Любая помощь с последним этапом картирования будет очень цениться
Спасибо
Saan
ДАЛЬНЕЙШЕЕ ИССЛЕДОВАНИЕ
Хорошо, я немного поработал над этим и убедился, что объединение двух классов работает нормально, если я сделаю это:
CLASS:
Set
{
public int Id {get; set;}
public string Name {get; set;}
//public SetQueryBuilder QueryBuilder{get; set;}
public IEnumerable<string> Category1Keys {get; set;}
public IEnumerable<int> Category2Ids {get; set;}
public IEnumerable<int> Category3Ids {get; set;}
}
MAPPING
SetMapping : ClassMap<Set>
{
public SetMapping()
{
Schema("cam");
Table("f_set");
Id(x => x.Id, "f_set_id").GeneratedBy.Identity();
Map(x => x.Name, "name").Not.Nullable();
//HasOne<SetQueryBuilder>(x => x.QueryBuilder);
HasMany(x => x.Category1Keys).Table("f_set_cat1").Element("cat1_key").KeyColumn("set_id");
HasMany(x => x.Category2Ids).Table("f_set_cat2").Element("cat2_id").KeyColumn("set_id");
HasMany(x => x.Category2Ids).Table("f_set_cat3").Element("cat3_id").KeyColumn("set_id");
}
}
При выполнении отображений nHibernate это имеет смысл, но мне бы очень хотелось иметь все отображения категорий в отдельном классе SetQueryBuilder.
Еще раз спасибо за любую помощь
Saan