4

編集: 以下の問題は Entity Framework 6 で修正されました。

以下のコードを実行すると、残念ながら 2 分 10 秒かかります。2 回目の実行には 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 ブロックを第 2 レベルのインタラクション内に移動し、そこで 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 に答える