Свободное отображение NHibernate для класса, где Id является ссылкой на другой класс - PullRequest
2 голосов
/ 04 марта 2011

Я пытаюсь использовать свободный 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

1 Ответ

0 голосов
/ 04 марта 2011

Вы ищете стратегию создания подклассов. Взгляните на это http://nhibernate.info/doc/nh/en/index.html#inheritance

Вы, вероятно, хотите следовать таблице за классом с таблицей за стратегию подкласса imo.

...