NHibernate 1: n сопоставления с 1: 1 с ограничениями - PullRequest
1 голос
/ 07 августа 2011

У меня есть мое заявление:

  1. У меня есть класс Продукт
  2. У меня есть пользователь отслеживания этого продукта, поэтому класс Отслеживание

Обратите внимание, что несколько пользователей могут отслеживать один продукт, поэтому соотношение между Продуктом: Отслеживание составляет 1: n

Однако, если пользователь в данный момент вошел в систему, это может быть только 1 Трек, связанный с продуктом, и на моей странице списка я должен отобразить список продуктов с его статусом трека для текущего пользователя, что-то как:

  • Продукт A - Отслеживается 2011-01-01
  • Продукт B - Не отслеживается
  • Продукт C - Отслеживается 2010-12-20
  • ...

Таким образом, в простом sql у меня может быть такой запрос:

select * from Product as p 
left outer join Track as t 
    on t.ProductId = p.Id and t.UserId = {currentUser.Id}

Но используя NHibernate, я нахожу это нелегко реализовать, в настоящее время у меня есть класс ProductWithTrack , который наследуется от класса Product и добавляет свойство Track :

class ProductWithTrack : Product {
    public Track Track { get; set; }
}

Я стараюсь сопоставить этот класс с таблицей Product точно так же, как класс Product , но как мне определить отображение свойства Track , я пробовал:

  • один ко многим, но Трек - это не коллекция
  • многие-к-одному / один-к-одному, для этого требуется столбец внешнего ключа в таблице Product, которого, конечно, не существует

Пожалуйста, помогите с этой проблемой сопоставления, спасибо.

1 Ответ

1 голос
/ 08 августа 2011

Один из подходов основан на наблюдении, что страница списка является отчетным представлением данных. В частности, он объединяет информацию о продуктах и ​​их статус отслеживания. Для представления отчетов вам не нужно создавать явное отображение для нужных данных, вместо этого вы можете использовать возможности запроса NHibernate и, возможно, проекции , чтобы получить нужные вам результаты , Другими словами, ProductWithTrack не обязательно должен быть собственной сущностью.

В качестве другого подхода вместо наследования ProductWithTrack от Product у вас должен быть класс TrackedProduct:

class TrackedProduct {
 public int ID { get; private set; }
 public Product Product { get; private set; }
 public Track Track { get; private set; }
}

Этот класс представляет концепцию отслеживаемого продукта и имеет свою собственную идентификацию. Затем вы можете запросить эту сущность, чтобы получить нужные данные.

...