4

编辑:以下问题已在实体框架 6 中修复。

运行下面的代码需要令人失望的 2 分 10 秒。第二次运行它需要 6.5 分钟。这个问题与这个有关

Private Sub RunTest()
    Dim sw As New Stopwatch
        sw.Restart()
        Using db As New TestDB
            db.Configuration.AutoDetectChangesEnabled = False
            For n = 1 To 100
                For m = 1 To 100
                    db.Tops.Add(New Top)
                Next
            Next
            db.SaveChanges()
        End Using
        MsgBox(sw.Elapsed.ToString)
    End Sub

实体:

Public Class Top
    Public Sub New()
        MyBase.New()
        One = "arerjlwkerjglwejrglwergoiwerhgiowehrowerlwelfvbwlervbowerghpiweurhgpiwuerviiervljwebbrlvjnepvjnweprvupiweurv"
        Two = "w;lrjgwwergkjwervgjwelrgjhwelghlwekglwergiuwehrgwjergjwervgjwerjgnwekrngpwergjpowergllwejrnglkwerngpoierhpiiuewrpjwenrwenrv;lwenrvkjernpgpsrvpi"

    End Sub

    'ID'
    Public Property ID As Integer

    'NATIVE PROPERTIES'
    Public Overridable Property One As String
    Public Overridable Property Two As String

    'NAVIGATION PROPERTIES'

End Class 

在第二级交互中移动 Using 块并在那里调用 SaveChanges 只会使情况变得更糟。

TestDB 只是继承 DBContext 而没有任何进一步的配置。当我禁用 Top.ID 属性的数据库生成并自己提供 ID 时,性能提高了 30 倍。这个问题使得在 SQL Server Compact 中使用数据库生成的 ID 成为不可能。除了使用客户端生成的 ID 之外,还有其他解决方案吗?

4

1 回答 1

3

我发现了这个问题,它是由获取生成的 id 导致表扫描的语句引起的,我在这里提出一个修复,用 4000 个实体测试,从 17 秒下降到 2 秒。http://entityframework.codeplex.com/workitem/857 - 它将包含在 Alpha 3 之后的 EF6 构建中

于 2013-02-15T13:26:20.300 回答