我使用的是带有核心框架和Entity Framework Core 1.0(以前称为Entity Framework 7)的ASP.NET Core 1.0(以前称为ASP.NET 5)应用程序。
在此博客https://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-available中,EF Core 1.0开发负责人表示不建议使用类似ORM的实体批量插入大量数据建议使用较低级别的方法(如SqlBulkCopy)直接使用数据库提供程序并跳过实体框架。
我有120,000条记录需要播种。目前我正在使用这样的东西:
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();
}
}
我从我的Startup.cs调用EnsureSeedData(path)
,其中我有一个MyDbContextSeedData
的实例
我对这种方法的发现和问题:
System.Data.SqlClient.SqlBulkCopy
这样的东西,因为这个类在核心框架中不存在。还有其他选择吗?有关如何使用ASP.NET Core框架 dnxcore50 播种大量数据的任何示例都将不胜感激!
答案 0 :(得分:1)
我相信你错了System.Data.SqlClient.SqlBulkCopy:
按照他们的建议,抛弃实体框架(任何条带)并使用sql批量复制,如果这将是一个正在进行的任务。另一方面,你说“种子” - 如果这是一次性的事情,只需在数据库中直接进行,然后从备份恢复以备将来“从头开始”的情况。