Мне кажется странным, что вам нужно много сеансов, чтобы выполнить одну работу. Обычно для выполнения всей работы достаточно одного сеанса.
Тем не менее, генератор Hilo устанавливает свойство id для сущности при вызове nhSession.Save(object)
, не обязательно требуя двустороннего обращения к базе данных и
nhSession.Flush()
сбросит вставки в базу данных
ОБНОВЛЕНИЕ ==================================================== =============================
Это метод, который я использовал в конкретном случае, в котором были вставлены вставки pure-sql при сохранении совместимости NHibernate.
//this will get the value and update the hi-lo value repository in the datastore
public static void GenerateIdentifier(object target)
{
var targetType = target.GetType();
var classMapping = NHibernateSessionManager.Instance.Configuration.GetClassMapping(targetType);
var impl = NHibernateSessionManager.Instance.GetSession().GetSessionImplementation();
var newId = classMapping.Identifier.CreateIdentifierGenerator(impl.Factory.Dialect, classMapping.Table.Catalog, classMapping.Table.Schema,
classMapping.RootClazz).Generate(impl, target);
classMapping.IdentifierProperty.GetSetter(targetType).Set(target, newId);
}
Итак, этот метод принимает вашу недавно созданную сущность как
var myEnt = new MyEnt(); //has default identifier
GenerateIdentifier(myEnt); //now has identifier injected based on nhibernate's mapping
обратите внимание, что этот вызов не помещает сущность в какое-либо управляемое пространство nhibernate. Таким образом, вам все равно нужно найти место для размещения ваших объектов и сэкономить на каждом из них. Также обратите внимание, что я использовал этот файл с чистыми вставками sql, и если вы не укажете generator="assigned"
(который затем потребует некоторый пользовательский генератор hi-lo) в отображении вашей сущности, nhibernate может потребоваться другой механизм для его сохранения.
В общем, вы хотите создать Id для объекта, который будет сохранен в будущем. Это вызывает некоторые проблемы, такие как обработка несуществующих записей из-за откатов и неудачных фиксаций. Кроме того, imo nhibernate не является инструментом для этой конкретной работы, вам не нужен nhibernate, чтобы выполнить массовую вставку, если нет какой-либо сложной логики сущностей, которая слишком затратна (во времени разработки) для самостоятельной реализации.
Также обратите внимание, что вы подразумеваете, что вам нужны временные отсоединенные сущности, которые, однако, не могут быть использованы, пока вы не вызовете .nhSes.Save (obj) в первом сеансе и сбросите его содержимое, так что 2-й сеанс, когда он вызывает Load для временного объекта в базе данных будет существующая строка, которая противоречит тому, чего вы хотите достичь.
Я не боюсь штурма базы данных, просто оптимизируйте процедуру сверху вниз, чтобы справиться с объемом. Использование nhibernate просто для вставки кажется контрпродуктивным, когда вы можете достичь того же результата с 4-кратным увеличением производительности, используя ado.net или даже упакованный запрос isqlquery (и используйте метод, который я предоставил выше)