NHibernate BulkInsert到SQL中的多对多关系表

时间:2019-03-06 04:55:03

标签: c# sql .net nhibernate nhibernate-mapping

这是用户和角色这两个模型

def uploadToS3(file_name):
    filepath = file_name + file_extension
    camera.capture(filepath)
    conn = tinys3.Connection(access_key_id, secret_access_key)
    f = open(filepath, 'rb')
    conn.upload(filepath, f, bucket_name,
               headers={
               'x-amz-meta-cache-control': 'max-age=60'
               })
    if os.path.exists(filepath):
        os.remove(filepath)

这些是已创建的映射

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; }
}

我的问题是:我们如何使用Nhibernate对这些表执行批量插入/更新操作?

预先感谢

1 个答案:

答案 0 :(得分:0)

您的情况还不够清楚;以下是适用于批量插入的常规步骤:

  1. 设置BatchSize = [您的首选值]。此操作数量将由NHibernate批量处理。
  2. 设置FlushMode = FlushMode.Commit。这将指示NHibernate在提交事务后刷新所有更改。
  3. 使用ISession打开sessionFactory.OpenSession()
  4. 使用session.BeginTransaction()开始交易。
  5. 执行所有插入操作。
  6. 使用transaction.Commit()进行交易。

如@FlorianLim所评论,如果您不想保持状态,则可能更喜欢IStatelessSession

模板代码以及有关此内容的更多说明,here

 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级别的插入批处理。