Добавить в коллекцию Nhibernate без инициализации коллекции - PullRequest
3 голосов
/ 08 августа 2011

У меня есть объект, называемый Метр (Представьте себе электрический счетчик).

Метр имеет набор точек данных.Каждые 15 минут или около того новая точка данных добавляется к счетчику.Счетчик имеет коллекцию этих точек данных.

Я хотел бы закодировать это, например, Meter myMeter = session.get<Meter>(id), а затем myMeter.AddDataPoint(point), а затем session.Update(myMeter).Внутри класс Meter имеет коллекцию (IESI.ISet<DataPoint>).Однако при добавлении в эту коллекцию я думаю, что NHibernate сначала должен будет инициализировать коллекцию и загрузить ее из базы данных.Проблема в том, что в этой коллекции будут сотни тысяч предметов, и она просто не будет производительной.Поэтому возможно ли это закодировать так, чтобы NHiberante слепо добавлял в коллекцию, не загружая все ее значения.

Класс DataPoint имеет преобразование «многие к одному» в измеритель, а измеритель имеетнабор отображений DataPoints.

Ответы [ 2 ]

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

1) Вы можете удалить отображение набора из класса Meter. Таким образом, вам никогда не удастся случайно загрузить тысячи точек данных. Позже, когда вам нужно будет узнать все DataPoints для Meter, вы можете загрузить его динамически. Похоже, вам понадобится подмножество точек данных большую часть времени (точки данных для метра X за август).

List<DataPoint> dp = DataPointsRepository.FindByMeter(Meter meter)
List<DataPoint> dp = DataPointsRepository.FindByMeter(Meter meter, DateRange range)

DataPoint по-прежнему потребуется отношение «многие-к-одному» для счетчика, чтобы правильно связать и сохранить.

2) Вы можете попробовать использовать 'bag' вместо 'set', но будьте осторожны, чтобы не вызывать такие методы, как obj.MyBag.Size () Связанный вопрос: Hibernate - Как сохранить новый элемент в коллекции, не загружая всю коллекцию

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

Семантика реализации ISet требует, чтобы NHibernate извлек полную коллекцию элементов, чтобы он мог убедиться, что точка, которую вы пытаетесь добавить, действительно уникальна. Я не думаю, что есть способ обойти это, кроме как проверить данные / сохранить их независимо от счетчика.

Что-то вроде (используя QueryOver):

var pointExists = session.QueryOver<DataPoint>().Where(p => p.Id==id /* etc */).Any();

if (!pointExists) {
    session.Save(dataPoint);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...