NHibernate: одного типа, разные классы? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть случай использования, когда один и тот же тип используется в разных отношениях один-ко-многим, и данные по многим сторонам отношения должны храниться в разных таблицах в зависимости от использования. Есть ли способ, которым я могу сказать (свободно) NHibernate, какой ClassMap использовать (например, как мой поддельный UseClassMap метод ниже)?

Пример грубого кода:

public class Foo
{
  public long Id {get; set;}
  public IEnumerable<Bar> TheoreticalBar {get; set;}
  public IEnumerable<Bar> ActualBar {get; set; }
}

public class FooMap : ClassMap<Foo>
{
  Table("Foo");
  Id(x => x.Id);
  HasMany(x => x.TheoreticalBar).UseClassMap(TheoryBarMap);
  HasMany(x => x.ActualBar).UseClassMap(ActualBarMap); 
}

public class TheoreticalBarMap : ClassMap<Bar>
{
  TableNames("TheoreticalBar");
  ...
}

public class ActualBarMap : ClassMap<Bar>
{
  TableNames("ActualBar");
  ...
}

1 Ответ

0 голосов
/ 04 ноября 2019

В надежде получить больше произвольных и необъяснимых отрицательных голосов, я отвечу на этот вопрос: я не смог найти конкретный метод для явного объявления ClassMap для использования, но я смог найти решение без добавления ненужныхподтипы или аналогичные ClassMaps, добавив значение дискриминатора в дочерний класс, установленный родителем, а затем с помощью метода .Where () отфильтровать значение дискриминатора ... примерно так:

class Bar
{
  public string BarType {get; protected set};

  public Bar(string barType)
  {
    BarType = barType;
  }
}

public class FooMap : ClassMap<Foo>
{
  Table("Foo");
  Id(x => x.Id);
  HasMany(x => x.TheoreticalBar).Where("BarType = theoretical");
  HasMany(x => x.ActualBar).Where("BarType = actual"); 
}

Метод .Where () позволяет использовать интерполяцию и подстановку строк в случае, если вы хотите избежать магических строк в моем упрощенном примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...