2016-11-08 78 views
1

給定一個實體,像一個的DbContext裝載大字符串屬性的實體時,以下幾點:業績不佳使用實體框架

public class Entity 
{ 
    public int Id {get;set;} 
    public string LargeString {get;set;} 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<Entity> Entities {get;set;} 
} 

,並存儲在數據庫Id 42和LargeString包含XML的一些兩兆字節的實體。下面以半分鐘左右,偶爾給OutOfMemoryException

using (var dbContext = new MyDbContext()) 
{ 
    var entity = await dbContext.Entities.SingleAsync(e => e.Id == 42); 
} 

與此同時,以下小巧玲瓏的查詢執行以毫秒爲單位:

using (var dbContext = new MyDbContext()) 
{ 
    var entity = await dbContext.Database.Connection 
     .Query<Entity>("SELECT Id, LargeString FROM Entities WHERE Id = 42") 
     .SingleAsync(); 
} 

是否有可能以某種方式暗示實體框架LargeString屬性可能會很大(以這種方式可以使實體框架在此方案中可接受)。

+3

嘗試'dbContext.Entities.AsNoTracking()單(E => e.Id == 42);'如果修復程序讓我知道 –

+0

好建議,我會盡力回覆你:) –

+0

'AsNoTracking()'不會顯着提高性能。然而,我的一位同事指出,我們這個問題簡化的生產代碼是異步的,這可能與性能有關,所以我更新了示例代碼以反映這一點。 –

回答

2

昨天我有同樣的問題。我發現的是,實體框架的異步操作被破壞或至少非常緩慢。嘗試使用相同的操作同步:

using (var dbContext = new MyDbContext()) 
{ 
    var entity = dbContext.Entities.Single(e => e.Id == 42); 
} 

通過rducom這裏還有閱讀帖子:https://stackoverflow.com/a/28619983/7108481