【发布时间】:2014-01-31 00:54:00
【问题描述】:
我使用 EF6 作为 ETL 工具的加载层。我承认有更好的工具(例如 SSIS、直接 SQL 查询等),但是由于转换的复杂性,它需要在代码中完成,并且目标数据库是从 EF 模型构建的。批处理中插入的记录数可以超过 100,000 条记录。这并不是非常慢(使用DBContext.AddRange() 方法),但内存使用率非常高(超过1GB)
例如,我有以下数据类(在内存中创建)
public class Foo
{
public long FooID { get; set; }
public string SomeProperty { get; set; }
public decimal AverageFlightSpeedOfUnladenSwallow { get; set; }
public IEnumerable<Bar> Bars { get; set; }
}
public class Bar
{
public long BarID { get; set; }
public Foo Foo { get; set; }
public long FooID { get; set; }
public string FavoriteColour { get; set; }
}
dbContext.Foos.AddRange(ListOfFoos); //Pre constructed list of Foos
dbContext.Bars.AddRange(ListOfBars); //Pre constructed list of Bars (parent Foo items populated, FooID is not)
dbContext.SaveChanges();
我正在考虑使用 LINQ 实体数据阅读器将IList<Foo> 转换为数据阅读器,以便我可以使用 SQLBulkCopy (SqlBulkCopy and Entity Framework,
http://archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId=389)。
要求 List<Bar> 将没有父 Foo 类的 ID。实体框架处理得很好,但我不确定如何在 SqlBulkCopy 中获得相同的功能。有什么办法可以完成吗?
【问题讨论】:
标签: c# sql-server entity-framework sqlbulkcopy