【问题标题】:Entity Framework 4.1 DatabaseGeneratedOption.Identity PerformanceEntity Framework 4.1 DatabaseGeneratedOption.Identity 性能
【发布时间】:2011-07-10 16:25:45
【问题描述】:

我目前正在开发一个使用 Entity Framework 4.1(代码优先)和 SQL Server CE 4.0 的应用程序。我真正喜欢 SQL Server CE 4.0 的新功能之一是计算值。

但是在将旧数据导入我的新数据存储系统(大约 50000 个条目)时,我遇到了一些性能问题。这是我的第二个实现。第一个版本使用 Entity Framework 4.0 和 SQL Server CE 3.5。但是这些实现之间存在巨大的性能差异。代码第一个实现大约需要一个小时来导入条目,另一个实现只需要几分钟。

大部分时间花在SaveChanges 方法上。我将问题追溯到[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性。如果我使用[DatabaseGenerated(DatabaseGeneratedOption.None)] 并实现我自己的密钥生成(作为一种简单的解决方法),性能将回到第一次实现的水平。

这是一个已知问题吗?有没有办法解决这个性能问题?还是生成我自己的密钥?

【问题讨论】:

  • 这里有两个关于 EF 4.1 中的批量插入的问题/答案:stackoverflow.com/questions/5943394/…stackoverflow.com/questions/5940225/… 关键主要是禁用自动更改检测。虽然我看不到与DatabaseGeneratedOption 的关系,但无论如何它可能会有所帮助。
  • 禁用 AutoDetectChangesEnabled 并没有真正提高我的性能(但我这样做了)。不使用 DatabaseGeneratedOption.Identity 的加速要高得多。

标签: c# entity-framework-4.1 sql-server-ce-4


【解决方案1】:

在您的应用程序的运行时间内保持一个 ObjectContext / 连接打开。 EF 不适合批量插入,请使用 SqlCeResultSet 以获得最大性能。

【讨论】:

  • 我已经在整个导入过程中保持 DBContext 打开,但是以 500 个条目的小单元提交似乎更快。问题是第一个版本的速度足以满足我的需要。
【解决方案2】:

我决定采用“生成我自己的密钥”的方式作为解决方法。我将密钥生成所需的功能添加到我的 DBContext 类中。

如果 Microsoft 对此行为进行更改,我会切换回自动生成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-08-15
    • 2023-03-22
    • 2011-09-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多