在SQL Server数据库中存储大量实体

时间:2017-01-26 05:42:42

标签: c# sql-server entity-framework

我有以下情况:我正在构建一个虚拟网络应用程序,每分钟提取一次赔率,将所有事件,比赛,赔率等存储到数据库,然后更新用户界面。

我有这样的结构:体育> 活动> 匹配> 投注> 赔率我正在使用代码优先方法,并且我正在使用EF进行所有与DB相关的操作。

当我第一次运行我的应用程序并且我的数据库为空时,我收到的赔率为XML: ~16 sports,~145个事件,~675个匹配,~17100个赌注和放大器; ~72824赔率

问题出现了:如何及时保存所有这些实体?解析不是耗时的操作 - 0.2秒,但是当我尝试批量存储所有这些实体时,我面临内存问题,并且保存耗时超过1分钟,因此下一次奇数拉动被触发,这是噩梦。

我看到某个地方禁用Configuration.AutoDetectChangesEnabled并在我插入的每100/1000条记录上重新创建我的上下文,但我不在那里。每个建议都将不胜感激。提前致谢

2 个答案:

答案 0 :(得分:1)

当您插入大量(虽然不是那么大)数据时,请尝试使用SqlBulkCopy。您也可以尝试使用Table Value Parameter并将其传递给存储过程,但我不建议这种情况,因为TVP对1000以下的记录表现良好。SqlBulkCopy超级易用,这是一个很大的优点

如果您需要对许多记录进行更新,您也可以使用SqlBulkCopy,但只需使用技巧。创建一个临时表并使用SqlBulkCopy将数据插入到临时表中,然后调用存储过程,该存储过程将从登台表中获取记录并更新目标表。我已经多次使用SqlBulkCopy这两种情况并且效果很好。

此外,使用SqlBulkCopy您也可以批量插入并向用户提供反馈,但是,在您的情况下,我认为您不需要这样做。但是,这种灵活性就在那里。

  

我可以只使用EF吗?

我没试过,但你可以尝试使用this库。

答案 1 :(得分:0)

我理解你的情况但是:

  

您所做的所有操作都取决于您的机器规格和   软件本身。

     

现在如果机器规格无法处理过程,那么现在是时候了   更改计划,以限制要插入的记录数   这一切都要完成。