为什么带有EF的C#Console Application在单行输入上返回OutofMemoryException

时间:2017-09-07 16:04:24

标签: c# entity-framework

我在数据模型类中有一个相当简单的方法,它只是插入一行并保存更改。它正确地处理了大约227条记录[在408中],然后返回OutofMemoryException。即使我们只处理单行条目并保存更改,也会发生这种情况。有任何想法如何解决这种情况?

protected ADMIN_DB_Entities _AdminEntities = new ADMIN_DB_Entities();

public void InsertBase64Payload(string sBase64PayloadValue, string sSourceValue, Guid gSourcePrimaryKey, DateTime dDateProcessed)
{
    Base64Payload newBase64PayLoadEntry = new Base64Payload();
    newBase64PayLoadEntry.BASE64_VALUE = sBase64PayloadValue;
    newBase64PayLoadEntry.SOURCE_TABLE = sSourceValue;
    newBase64PayLoadEntry.SOURCE_PRIMARY_KEY = gSourcePrimaryKey;
    newBase64PayLoadEntry.DATE_PROCESSED = dDateProcessed;
}
try
{
  _AdminEntities.Base64Payload.Add(newBase64PayLoadEntry);
  _AdminEntities.SaveChanges();
}
catch (Exception ex)
{
    ConsoleAppLog.WriteLog(<Error Message here.>)
}

1 个答案:

答案 0 :(得分:2)

我认为你正在使用非常大的base64“有效载荷”。

EntityFramework的DbContext将实体的状态保存在内存中。因此,即使将更改保存到数据库中,这些值也将位于进程内存中。 DbContext实现IDisposable接口,因此在这种情况下,最好在将所需数据保存到数据库后配置上下文:

using (var entites = = new ADMIN_DB_Entities())
{
   try
   {
      entities.Base64Payload.Add(newBase64PayLoadEntry);
      entities.SaveChanges();
   }
   catch (Exception ex)
   {
      ConsoleAppLog.WriteLog(ex.Message);
   }
}

注意:请记住,有一种机制可以从内部数据库上下文的跟踪中取消/附加特定实体,因此如果需要,您还可以使用单个DbContext实例。