c# - Insertar una colección de entidades a granel usando Fluent NHibernate
sql-server-2008 fluent-nhibernate (1)
Estoy tratando de insertar una gran colección de objetos en una tabla usando NHibernate con fluidez, usando una llamada para guardar o actualizar pasando cada entidad de la colección en un ciclo foreach. Había estado configurando el tamaño del lote al tamaño de la colección, sin embargo, he leído en el blog de Ayende que no se recomienda configurarlo a valores grandes, así que lo he limitado a 250, sin embargo, cuando veo la colección en NHProf, vea una secuencia de instrucciones de inserción (la colección es de aproximadamente 20000 elementos) en lugar de un conjunto de llamadas de inserción por lotes.
Esto parece ser muy ineficiente y lleva mucho más tiempo de lo que esperaba para una consulta que es muy básica en esencia: insertar un valor en 25 columnas (sí, ese es un lugar donde podría mejorarse, pero es una base de datos heredada). que estoy atrapado por ahora) en una base de datos de SQL Server 2008, así que solo puedo asumir que lo estoy haciendo mal.
¿Hay alguna forma recomendada de insertar grandes colecciones de entidades usando NHibernate? ¿Se puede obtener una ganancia de eficiencia usando Save over SaveOrUpdate?
Código del método de agregar: la llamada de SetBatchSize es donde el lote está limitado a 250, o se establece en el tamaño de la colección si es menor a 250:
public void Add(IEnumerable<TEntity> entities)
{
var session = GetCurrentSession();
using (var transaction = session.BeginTransaction())
{
entities = entities.ToList();
session.SetBatchSize(SetBatchSize(entities.Count()));
foreach (var entity in entities)
session.SaveOrUpdate(entity);
transaction.Commit();
}
}
Disculpas por la pregunta un tanto vaga, tengo la sensación de que estoy abordando las cosas por el camino equivocado y ¡cualquier apuntador sería muy apreciado!
Querrá utilizar un StatelessSession para inserciones masivas.
(relacionado: Inserciones de sesión sin estado de NHibernate son lentas )