NHibernate BulkInsert в таблицу отношений многие ко многим в SQL - PullRequest
0 голосов
/ 06 марта 2019

Это две модели: пользователь и роль

public class User
{
    public User()
    {
         Roles = new List<Role>();
    }

    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual IList<Role> Roles { get; set; }
}

public class Role
{
    public virtual Guid RoleId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<User> Users { get; set; }
}

Это сопоставления, которые были созданы

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId).GeneratedBy.Identity();
        Map(x => x.UserName);
        HasManyToMany(x => x.Roles)
             .Cascade.All()
             .Table("UserRoles");
    }
}

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        Id(x => x.RoleId).GeneratedBy.GuidComb();
        Map(x => x.Name);
        HasManyToMany(x => x.Users)
            .Cascade.All()
            .Inverse()
            .Table("UserRoles");
    }
}

Мой вопрос: как мы можем выполнить массовую вставку / обновлениеоперация в этих таблицах с использованием Nhibernate?

Заранее спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Ваш сценарий недостаточно ясен;Ниже приведены общие шаги, которые должны работать для массовой вставки:

  1. Установить BatchSize = [Ваше предпочтительное значение].Это количество действий будет распределено NHibernate.
  2. Set FlushMode = FlushMode.Commit.Это заставит NHibernate сбросить все изменения после совершения транзакции.
  3. Открыть ISession с использованием sessionFactory.OpenSession().
  4. Начать транзакцию с использованием session.BeginTransaction().
  5. Выполнить всеваши действия вставки.
  6. Подтвердите транзакцию, используя transaction.Commit().

Как прокомментировал @FlorianLim, вы можете предпочесть IStatelessSession, если вы не хотите поддерживать состояние.

Код шаблона и дополнительные пояснения по этому поводу можно найти здесь :

 using (ISession session = sessionFactory.OpenSession())
 using (ITransaction tx = session.BeginTransaction())
 {
     for (int i = 0; i < 100000; i++)
     {
         Customer customer = new Customer(.....);
         session.Save(customer);
     }
     tx.Commit();
 }

Но я сомневаюсь, что это будет работать с вашим сценарием.Тип данных вашего столбца UserId: Identity.Пакетирование не работает с ним.

Обратите внимание, что NHibernate отключает пакетную вставку на уровне ADO прозрачно, если вы используете генератор идентификатора идентификатора.

...