1
    protected override void Seed(Fitlife.Domain.Concrete.EFDBContext context)
    {
        List<List<string>> foodweights = GetLines(basePath + "FoodWeights.txt");
        int counter = 0;
        foodweights.ForEach(line =>
        {
            FoodWeights newVal = new FoodWeights()
            {
                 FoodCode = int.Parse(line[0]),
                  PortionCode = int.Parse(line[1]),
                 PortionWeight = decimal.Parse(line[2])
            };
            context.FoodWeights.Add(newVal);

            if (++counter == 1000)
            {
                counter = 0;
                context.SaveChanges();                  
            }
        });
}

上述方法用于填充我的数据库。但是 1000 个条目需要 50 秒我有一个包含 470k 条目的文件,我如何提高使用实体框架的性能,并且当我使用包管理器执行 PM> update-database 时调用此方法。我需要类似的功能,我对 asp.net 和实体框架非常陌生,任何指导将不胜感激。

PS:1000 个条目需要 50 秒是可以的,还是我做错了什么。

4

1 回答 1

1

Seed 方法在应用程序每次启动时运行,因此您编写它的方式将尝试FoodWeight一遍又一遍地添加 s。EF 提供了AddOrUpdate一种方便的方法来防止这种情况,但它确实不适合批量插入。

您可以直接在数据库上使用 sql - 如果您使用的是 sql server,则 sql 可能是'BULK INSERT'

我会将 sql 置于 Up 迁移中,因为您可能只想从已知状态运行一次插入,并且不必担心上下文的效率和跟踪更改等。

这里有示例代码和更多信息:how to seed data using sql files

于 2013-10-11T08:20:12.210 回答