Как указать тип / класс отдельного свойства (дискриминатора) в запросе Fluent-nHibernate. - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть сценарий, в котором класс с именем «Comment» ссылается на абстрактный тип с именем «Entity».Fluent-ClassMap выглядит очень похоже на следующее для свойства "Entity":

classMap.ReferencesAny(x => x.Entity)
   .EntityTypeColumn("DiscriminatorType")
   .EntityIdentifierColumn("DiscriminatorId")
   .IdentityType<int>()
   .AddMetaValue(typeof(Car), typeof(Car).Name);
   .AddMetaValue(typeof(House), typeof(House).Name);

Как вы, возможно, уже обнаружили из приведенного выше примера, класс "Entity" подклассируется классом с именем "House"и класс под названием «Автомобиль».При такой настройке довольно просто получить все комментарии для определенного «объекта», просто выполнив что-то вроде следующего: Session.Query (). Где (m => m.Entity == myCarObject) .ToList ().Все работает как шарм.

Вот упрощенная структура класса:

abstract class Entity{}
class Car : Entity{}
class House : Entity{}

class Comment 
{ 
  public virtual Entity { get; set;}
}

Однако в одном случае использования мне нужно извлечь все экземпляры «Comment», которые ссылаются на любой «Car».Другими словами, я пытаюсь добиться чего-то вроде следующего:

var allCommentsOnCars1 = Session.Query<Comment>().Where(m => m.Entity is Car); //or
var allCommentsOnCars2 = Session.Query<Comment>().Where(m => m.Entity.GetType() == typeof(Car));

Оба примера не работают (последний бросает GetType () - не реализованное исключение), но возможно ли это как-то решить??Скорее всего, я мог бы легко очистить свои проблемы, создав две отдельные таблицы: одну для всех комментариев "Cars", а другую для всех комментариев "Houses", но я бы не хотел менять ни структуру базы данных, ни модели в данный момент.

Ваша обратная связь будет принята с благодарностью.

1 Ответ

0 голосов
/ 29 февраля 2012

Возможно, не самое элегантное решение, но я решил проблему, просто используя QueryOver () вместо Query ().

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