Сопоставить недвижимость с последней записью в NHibernate - PullRequest
1 голос
/ 03 июня 2009

Допустим, мой домен выглядит так:

  • У меня есть объект Vehicle, у которого есть свойство OdometerReading.
  • OdometerReading имеет мили и дату (когда она была прочитана).

Мне нужно хранить историю всех показаний одометра для автомобиля в базе данных, но я не хочу, чтобы вся история одометра принадлежала объекту корабля. То, что я хотел бы, для карты свойств OdometerReading к самой последней записи OdometerReading из базы данных.

Я подумал о том, чтобы отобразить всю коллекцию OdometerReadings на Автомобиль и иметь динамическое свойство CurrentOdometerReading, которое упорядочит их и вернет последний, но мне не нужна вся коллекция в разделе Транспорт в моем домене, и Похоже, я бы получал больше данных из базы данных, чем мне нужно.

Возможно ли это с NHibernate? Как мне сопоставить такую ​​вещь?

Ответы [ 3 ]

1 голос
/ 03 июня 2009

Есть предложение "where", которое вы можете поместить в отображение вашей коллекции. Проверьте справочную документацию.

1 голос
/ 03 июня 2009

Я бы сопоставил свойство OdometerReading как компонент, а затем использовал бы именованный запрос, чтобы убедиться, что он заполнен последними данными из базы данных. (В этом примере у вас будет sql-запрос с именем «vehicle», который выполняет SQL для загрузки столбцов Vehicle вместе с последними показаниями одометра)

<class name="Vehicle">
    <property name="Type" not-null="true"/>
    <component name="OdometerReading">
        <property name="Miles" />
        <property name="Date" />
    </component>
    <loader query-ref="vehicle"/>
</class>
1 голос
/ 03 июня 2009

Есть несколько способов сделать это в зависимости от того, как вы хотите, чтобы ваша модель домена выглядела. Мой предпочтительный выбор - использовать пользовательский тип коллекции, например IOdometerReadingCollection, к которому вы можете добавить дополнительные методы. В этом случае это может быть что-то вроде:

public interface IOdometerReadingCollection : IList<OdometerReading>
{
    OdometerReading Latest { get; }
}

Таким образом, вы можете сделать:

OdometerReading reading = vehicle.OdometerReadings.Latest;

который я предпочитаю:

OdometerReading reading = vehicle.LatestOdometerReading;

Существует множество документов о пользовательских коллекциях, которые можно найти с помощью простого поиска в Google.

Если этот подход не для вас, есть другие варианты. Возможно, вы сможете использовать свойство с формулой (я не уверен, что оно работает со сложными типами?) Или регулярную ассоциацию NHibernate, где у вас будет ключ последней OdometerReading в вашем отображении транспортного средства. Как вы также упомянули, вы можете просто загрузить все OdometerReadings, что, в зависимости от вашего варианта использования, может быть вполне приемлемым.

Надеюсь, это поможет или, по крайней мере, укажет вам правильное направление.

...