实体框架6 system.outofmemoryexception

时间:2014-07-29 14:53:50

标签: entity-framework stored-procedures entity-framework-6

我一直在收到system.outofmemoryexception:

  

类型的异常' System.OutOfMemoryException'被扔了。   在System.Collections.Generic.List 1.set_Capacity(Int32 value) at System.Collections.Generic.List 1.EnsureCapacity(Int32 min)   在System.Collections.Generic.List 1.Add(T item) at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source)   at CIGDataLibrary.Archive.ArchiveCycleData(String applicationName)   在c:!TFS \ SCCSoftware \ Commercial \ CIG \ Wagering \ CIGDataLibrary \ files \ Archive.cs:第571行

第571行的代码:

List<Guid?> cycleData = Queries.Current.GetCycleDataArchiveList();

方法:

public static List<Guid?> GetCycleDataArchiveList()
{
    using (var dbContext = new CIGDataModels.CIGDBStoredProcModels())
    {
        return dbContext.usp_arch_GetCycleData().ToList();
    }
}

存储过程的内容:

SELECT TOP 1000 gpCycleData_Id FROM CIGDB.dbo.cig_Cycle_gpCycleData
WHERE [TimeStamp] < DATEADD(HH, 3, DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())))
ORDER BY [TimeStamp]

有关为何发生这种情况的任何想法?它应该返回1000条记录(只是一个GUID列表),所以不应该扔掉一个合适的,对吧?我已将SP降至TOP 1但仍导致相同的错误。

2 个答案:

答案 0 :(得分:0)

您的生产数据库返回了太多行。它可能错过了存储过程中的TOP n子句,因此它返回了大量数据,导致应用程序内存不足。

正如你所说,你已经编辑了存储过程只返回一行并且它仍然会导致错误,必须有另一个因素。

假设程序没有比你发布的更多,原因可能是:

  1. 触发器以某种方式影响输出。
  2. 实体框架正在调用不同的过程。检查模型的内容以确定正在调用的正确过程。
  3. 另一个过程存在于不同的模式中。例如,您的应用使用用户名myApp登录数据库,当它调用MyProc时,它会解析为myApp.MyProc而不是dbo.MyProc

答案 1 :(得分:0)

好的,我发现了问题并且已按预期运行。

与异常的堆栈跟踪相反,错误在第572行,而不是571。 那条线是

List<Guid> arch_gpCycle = dbarchContext.cig_Cycle_gpCycleData.Select(s => s.gpCycleData_Id).ToList();

这导致了system.outofmemoryexception。我已将其更改为已编译的查询,该查询返回Guids列表并且已成功运行。