2011-07-10 65 views
0

我目前正在使用實體框架4.1(代號第一)和SQL Server CE 4.0的應用程序。我從SQL Server CE 4.0中真正喜歡的新事物之一是計算值。實體框架4.1 DatabaseGeneratedOption.Identity性能

但我有一些性能問題,同時導入舊數據到我的新的數據存儲系統(約50000項)。這是我的第二個實現。第一個版本使用Entity Framework 4.0和SQL Server CE 3.5。但是這些實現之間存在巨大的性能差異。代碼第一次實現需要大約一個小時來導入條目,另一個實現只需要幾分鐘。

中大部分時間在SaveChanges方法花費。我將問題追溯到[DatabaseGenerated(DatabaseGeneratedOption.Identity)]屬性。如果我使用[DatabaseGenerated(DatabaseGeneratedOption.None)]並實現我自己的密鑰生成(作爲一種簡單的解決方法),則性能將回到第一個實現的水平。

這是一個已知的問題?有什麼辦法可以解決這個性能問題嗎?或者正在生成我自己的密鑰?

+0

這裏有兩個問題/關於EF 4.1批量插入答案:http://stackoverflow.com/questions/5943394/why-is-inserting-entities-in-ef-4-1-so-slow-compared- to-objectcontext/5943699#5943699和http://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework/5942176#5942176密鑰主要是禁用自動更改檢測。雖然我沒有看到與'DatabaseGeneratedOption'的關係,但也許它有幫助。 – Slauma

+0

禁用AutoDetectChangesEnabled並不能真正改善我的情況下的性能(但我這樣做)。不使用DatabaseGeneratedOption.Identity的速度要高得多。 – Fox32

回答

0

我決定去「生成我自己的密鑰」方式作爲解決方法。我爲我的DBContext類添加了生成密鑰所需的功能。

如果這種行爲改變微軟的東西,我切換回自動生成。

0

保持一個ObjectContext的/連接打開你的應用程序的liftime。 EF對於批量插入不理想,請使用SqlCeResultSet進行批量插入。

+0

我已經爲整個導入過程保持DBContext打開,但以500個條目的小單位提交似乎更快。問題在於第一個版本足夠滿足我的需求。 – Fox32