Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 实体框架核心1.0-如何为大量数据播种_Asp.net Core_Sqlbulkcopy_Entity Framework Core_Seeding - Fatal编程技术网

Asp.net core 实体框架核心1.0-如何为大量数据播种

Asp.net core 实体框架核心1.0-如何为大量数据播种,asp.net-core,sqlbulkcopy,entity-framework-core,seeding,Asp.net Core,Sqlbulkcopy,Entity Framework Core,Seeding,我正在使用一个ASP.NET Core 1.0(以前称为ASP.NET 5)应用程序,该应用程序具有Core framework和Entity framework Core 1.0(以前称为Entity framework 7) 在本博客中,负责EF Core 1.0开发的人士表示,不建议使用类似ORM的实体批量插入大量数据,他们建议使用较低级别的方法,如SqlBulkCopy,直接使用数据库提供程序并跳过实体框架 我有12万张唱片需要播种。目前我使用的是这样的东西: private reado

我正在使用一个ASP.NET Core 1.0(以前称为ASP.NET 5)应用程序,该应用程序具有Core framework和Entity framework Core 1.0(以前称为Entity framework 7)

在本博客中,负责EF Core 1.0开发的人士表示,不建议使用类似ORM的实体批量插入大量数据,他们建议使用较低级别的方法,如SqlBulkCopy,直接使用数据库提供程序并跳过实体框架

我有12万张唱片需要播种。目前我使用的是这样的东西:

private readonly MyDbContext _context;

public MyDbContextSeedData(MyDbContext context)
{
    _context = context;

}

public void EnsureSeedData(string seedPortsFilePath)
{
    SeedPorts(seedPortsFile);
}

private void SeedPorts(string seedPortsFilePath)
{
    if (!_context.Ports.Any())
    {
        var ports = PortsData.GetPorts(seedPortsFile);
        List<Port> listPorts = ports.ToList();
        // the following statement commented out did not make any improvement
        // _context.ChangeTracker.QueryTrackingBehavior = Microsoft.Data.Entity.QueryTrackingBehavior.NoTracking
        _context.AddRange(portsRange);
        _context.SaveChanges();
    }
}
private只读MyDbContext\u context;
公共MyDbContextSeedData(MyDbContext上下文)
{
_上下文=上下文;
}
public void encuresedData(字符串seedPortsFilePath)
{
种子端口(种子端口文件);
}
专用void种子端口(字符串种子端口文件路径)
{
if(!\u context.Ports.Any())
{
var-ports=PortsData.GetPorts(seedPortsFile);
List listPorts=ports.ToList();
//以下被注释掉的语句没有任何改进
//\u context.ChangeTracker.QueryTrackingBehavior=Microsoft.Data.Entity.QueryTrackingBehavior.NoTracking
_AddRange(portsRange);
_SaveChanges();
}
}
我正在从Startup.cs调用
ensureseddata(path)
,在那里我有一个
MyDbContextSeedData

我对这种方法的发现和问题:

  • 插入所有记录需要30分钟以上
  • 我不能使用类似于
    System.Data.SqlClient.SqlBulkCopy
    的东西,因为核心框架中不存在此类。还有别的选择吗
  • 实体框架,在幕后并根据日志,似乎正在将INSERT SQL语句分成1999个值的块。它似乎还关闭了插入之间的DB连接。我想这一切都是由实体以最有效的方式管理的
  • 我找不到任何关于数据库种子最佳实践的例子。我是否应该在应用程序启动时使用类似于我的方法和代码种子的方法(假设我找到了一种更快的插入方法)?还是应该使用某种执行SQL脚本的迁移

  • 任何关于如何使用ASP.NET Core frameworkdnxcore50播种大量数据的示例都将不胜感激

    我相信您对System.Data.SqlClient.SqlBulkCopy的理解是错误的:


    按照他们的建议去做,抛弃实体框架(任何条带),如果这是一项正在进行的任务,就使用sql批量复制。另一方面,您说的是“种子”——如果这是一次性操作,只需在数据库中直接执行,然后从备份中恢复,以备将来“从头开始”使用。

    您是否检查了此操作的瓶颈?您是否执行过任何分析?我不会责怪数据库。插入数十万条记录通常不会超过2-5分钟(假设表没有1k列=])实体框架ORM是瓶颈,而不是数据库本身。不建议对大型插入使用实体。这就是为什么我需要一些替代方案我有一个dotnet5.4类库项目。SqlBulkCopy目前不存在。我知道它是corefx的一部分,但这是否意味着它已经可以用于dotnet5.4?如果是这样的话,在
    System.Data.SqlClient
    下看不到SqlBulkCopy有什么不对?