【问题标题】:Bulk Insert Options批量插入选项
【发布时间】:2020-03-24 05:39:40
【问题描述】:

我有一个用户列表,我想使用 excel 文件导入我的应用程序。

这个过程涉及几个表,即:Users、Roles、PasswordPolicy、Quotations、DocumentTypes

目前流程如下:

当我上传我的 Excel 时,它会读取并填充用户对象列表。然后返回此列表,然后将其传递给另一个函数,我在其中创建角色、密码策略、引用和 DocumentType。

这就是我通常创建 1 个用户的方式

var applicationUser = new User
 {
     FirstName = StripTags.Strip(Input.FirstName),
     LastName = StripTags.Strip(Input.LastName),
     UserName = StripTags.Strip(Input.UserName),
     Email = StripTags.Strip(Input.Email),
     PhoneNumber = StripTags.Strip(Input.PhoneNumber),
     DateOfBirth = Input.DateOfBirth,
     NormalizedUserName = Input.UserName.ToUpper(),
     NormalizedEmail = Input.Email.ToUpper()
 };

 var result = _userManager.CreateAsync(applicationUser, Input.Password);
 if (result.Result.Succeeded)
 {
     return applicationUser;
 }
 else
 {
     return null;
 }

但是,问题是我的输入 Excel 中只有 1000 行,创建它可能需要 20 多分钟。

我正在尝试为我的其他表格搜索批量插入选项以加快速度,但到目前为止我只找到了一种付费解决方案。

我使用 MySQL。 .net core 2.2 是否有批量插入 efcore 库?

我也尝试过使用 SqlBulkCopy 方法,但我不断收到异常说明

不支持关键字“端口”

这是sqlbulkcopy方法

var cp = new[] {
     nameof(UserDocumentCategory.Id),
     nameof(UserDocumentCategory.DocumentCategoryId),
     nameof(UserDocumentCategory.UserId),
     nameof(UserDocumentCategory.TenantId),
 };
 using(var sqlCopy = new SqlBulkCopy("server=localhost;port=3306;database=AppOne;user=root;password="")
 {
     sqlCopy.DestinationTableName = "[UserDocumentCategory]";
     sqlCopy.BatchSize = 1000;
     using(var reader = ObjectReader.Create(Input,cp))
     {
         sqlCopy.WriteToServer(reader);
     }
 }

我还有什么其他选择?

【问题讨论】:

  • 很确定 SqlBulkCopy 是用于 Sql Server 的。仅仅几千次操作,20 分钟似乎太长了。
  • MySqlBulkLoader 有帮助吗?
  • 我明白了。我会尝试 MySqlBulkLoader。我正在尝试减少时间。

标签: c# mysql .net-core


【解决方案1】:
  1. 您应该创建一个 ApplicationUsers 列表
  2. 除了上面的设置之外,请记住设置以下字段

PasswordHash = hasher.HashPassword(new ApplicationUser(), "RandomPassword");

Id = Guid.NewGuid().ToString();

SecurityStamp = Guid.NewGuid().ToString();

这里的 hasher 如下,将 hasher 排除在 insert 循环之外,并使用 hasher in loop 来设置每个 User 对象

var hasher = new PasswordHasher<ApplicationUser>();
  1. 使用 Context.AddRange(listOfUsers) 批量插入
  2. 列表项

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多