添加到Nhibernate集合而不初始化集合

时间:2011-08-08 17:08:44

标签: .net nhibernate

我有一个叫米的实体(想想电表)。

仪表有一组数据点。每15分钟左右,新的数据点将添加到仪表中。仪表具有这些数据点的集合。

我想对此进行编码,例如Meter myMeter = session.get<Meter>(id)然后myMeter.AddDataPoint(point)然后session.Update(myMeter)。在内部,Meter类有一个集合(IESI.ISet<DataPoint>)。但是当我添加到这个集合时,我认为NHibernate首先必须初始化集合并从数据库加载它。问题是这个系列中会有成千上万的物品,而且效率不高。因此可以对其进行编码,以便NHiberante盲目地添加到集合中,而不会加载其所有值。

DataPoint类具有与Meter的多对一映射,而Meter具有DataPoints的集映射。

2 个答案:

答案 0 :(得分:3)

1) 您可以从Meter类中删除集映射。这样,您就不会意外地加载数千个数据点。稍后当您需要了解Meter的所有DataPoints时,您可以动态加载它。看起来您大多数时间都需要数据点的子集(Meter X for August的数据点)。

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

DataPoint仍然需要多对一的计量关系才能正确关联和保存。

2)您可以尝试使用'bag'而不是'set',但要注意不要调用obj.MyBag.Size()等方法 相关问题: Hibernate - How to persist a new item in a Collection without loading the entire Collection

答案 1 :(得分:0)

ISet实现的语义要求NHibernate提取完整的项集合,以便它可以验证您尝试添加的点确实是唯一的。我不认为除了检查数据/保持它独立于仪表之外还有其他办法。

(使用QueryOver):

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

if (!pointExists) {
    session.Save(dataPoint);
}