实体框架并加载所有数据库条目,然后根据需要加载每个条目

时间:2013-11-01 11:40:06

标签: c# sql sql-server entity-framework

我有一个场景,我需要将数据库表与来自外部系统的列表(XML)同步。

我正在使用EF,但我不确定在性能方面哪个是最好的方法。

我认为有两种方法可以做到这一点,但对我来说似乎都没有效率。

  1. 每次调用Db - 从XML中读取每个条目 - 尝试并从列表中检索条目 - 如果未找到任何条目,请添加条目 - 如果找到,请更新时间戳 - 在循环结束时,删除所有带有旧时间戳的条目。

  2. 加载所有对象并在内存中工作

    • 将所有EF对象读入列表。
    • 删除所有EF对象
    • 为XML中的每个项目添加项目
    • 将更改保存到Db。
  3. 列表不长,估计大约70k行。我不想在插入新行之前清除db表,因为这个表是来自webservice的数据源,我不想锁定表,而它可以查询它。

    如果我在T-SQL中执行此操作,我很可能会将行插入临时表,并加入以查找丢失和删除的条目,但我不知道如何在实体框架中处理此问题的最佳方法是。

    有任何建议/想法吗?

3 个答案:

答案 0 :(得分:2)

实体框架的一般问题是,在更改数据时,无论是懒惰还是急切加载,它都会为每个已更改的记录触发查询。因此,它本质上会非常缓慢(想想因素1000 +)。

我的建议是使用带有表值参数的存储过程并一起忽略实体框架。您可以使用merge语句。

70k行并不多,但70k插入/更新/删除语句总是非常慢。

你可以测试它,看看性能是否可以管理,但直觉说实体框架不是可行的方法。

答案 1 :(得分:1)

我将迭代XML中的元素并一次更新DB中的相应行。我猜你的第一个选择是什么意思?只要您有一个好的查询计划来选择每一行,那应该非常有效。就像你说的那样,70k行并不是那么多,所以你最好保持代码简单,而不是做一些不太可读的东西,以便更快一点。

答案 2 :(得分:1)

这取决于。如果没有太多变化(比如少于几百个),可以使用EF。否则,需要批量插入数据库并合并数据库中的行。