Insertion d'une collection d'entités en vrac à l'aide de Fluent NHibernate

J'essaie d'insérer une grande collection d'objets dans un tableau à l'aide de fluent NHibernate, à l'aide d'un appel à enregistrer ou mettre à jour en passant chaque entité de la collection dans une boucle foreach. J'avais été réglage de la taille des lots à la taille de la collection, cependant j'ai lu sur Ayende le blog de ce paramètre sur les grandes valeurs n'est pas recommandé si j'ai plafonné à 250, cependant lorsque je l'ai vue la collection NHProf, je vois un flux d'instructions insert (la collection est d'environ 20000 articles) plutôt que d'un ensemble de lots insérer des appels.

Cela semble très inefficace et prend beaucoup plus de temps que je m'attends à une requête qui est très basique dans son essence - insertion d'une valeur dans 25 colonnes (oui, c'est un endroit de ce qui pourrait être mieux, mais c'est un héritage de la base de données que je suis bloqué pour l'instant) dans une base de données SQL Server 2008 - donc, je ne peux que supposer, je suis en train de faire le mal.

Est-il recommandé d'insérer de grandes collections d'entités à l'aide de NHibernate? Est-il un gain d'efficacité en utilisant les Enregistrer sur SaveOrUpdate?

Code de la méthode add - l'SetBatchSize appel est où le lot est plafonné à 250, ou de définir la taille de la collection si c'est moins de 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();
    }
}

Excuses pour le peu de vagues question, j'ai l'impression que je suis juste approcher les choses de la mauvaise façon et tous les pointeurs serait grandement apprécié!

source d'informationauteur Ian Cotterill

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *