代码之家  ›  专栏  ›  技术社区  ›  loki

如何解决实体框架内存不足的异常错误?

  •  2
  • loki  · 技术社区  · 16 年前

    下面的代码给出了我的Rehber数据的全部数据。但如果我想通过GridView显示网页,请发送内存不足异常错误。

    GenoTip.BAL:

    
    
        public static List<Rehber> GetAllDataOfRehber()
            {
                using (GenoTipSatisEntities genSatisCtx = new GenoTipSatisEntities())
                {
                    ObjectQuery<Rehber> rehber = genSatisCtx.Rehber;
                    return rehber.ToList();
                }
            }
    

    如果我直接绑定数据,这样的虚拟网格视图没有问题,每件事都是伟大的!!!!

     <asp:GridView ID="gwRehber" runat="server">
    
           </asp:GridView>

    如果以上代码将数据发送到satis.aspx页面:

    using GenoTip.BAL;
    
    
    namespace GenoTip.Web.ContentPages.Satis
    {
        public partial class Satis : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    gwRehber.DataSource = SatisServices.GetAllDataOfRehber();
                    gwRehber.DataBind();
                    //gwRehber.Columns[0].Visible = false;
                }
            }
        }
    }

    但是我重新排列了我的网格视图,把我的内存中的异常发送出去!!!!!我需要这个安排来展示DETA!!!!

     <asp:GridView ID="gwRehber" runat="server">
           <Columns>
          <%-- <asp:TemplateField>
           <ItemTemplate>
            <asp:Button runat="server" ID="btnID" CommandName="select"  CommandArgument='<%# Eval("ID") %>'  Text="Seç" />
           </ItemTemplate>
    
           </asp:TemplateField>--%>
           <asp:BoundField DataField="Ad" HeaderText="Ad" />
           <asp:BoundField DataField="BireyID" HeaderText="BireyID" Visible="false" />
           <asp:BoundField DataField="Degistiren" HeaderText="Değiştiren" />
            <asp:BoundField DataField="EklemeTarihi" HeaderText="EklemeTarihi" />
           <asp:BoundField DataField="DegistirmeTarihi" HeaderText="Değiştirme Tarihi" Visible="false" />
           <asp:BoundField DataField="Ekleyen" HeaderText="Ekleyen" />
            <asp:BoundField DataField="ID" HeaderText="ID" Visible="false" />
           <asp:BoundField DataField="Imza" HeaderText="Imza" />
            <asp:BoundField DataField="KurumID" HeaderText="KurumID" Visible="false" />
           </Columns>
           </asp:GridView>

    错误详细信息:

    【OutofMemoryException:'System.OutofMemoryException'T_¼R_¼NDE_¶Zel Durum Olu_159;Turuldu.】 system.string.getStringForStringBuilder(字符串值,Int32 StartIndex,Int32长度,Int32容量)+29 system.convert.tobase64string(byte[]inarray,int32 offset,int32 length,base64formattingoptions选项)+146 system.web.ui.objectStateFormatter.serialize(对象状态图)+183 System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize(对象状态)+4 System.Web.UI.Util.SerializeWithAssert(IStateFormatter格式化程序,对象状态图)+37 system.web.ui.hiddenfieldPageStatePersister.save()+79 system.web.ui.page.savepageStateToPersistenceMedium(对象状态)+105 system.web.ui.page.saveAllState()+236 system.web.ui.page.processRequestMain(Boolean includeStatesBeforeAsyncPoint,Boolean includeStatesAfterAsyncPoint)+1099

    1 回复  |  直到 16 年前
        1
  •  2
  •   Marc Gravell    16 年前

    所以看起来问题是,你们把太多的东西放进了状态;这很可能意味着一个(或两个)的:

    • 你读得太远了,太多了
    • 序列化程序正在执行(可能是惰性加载?)属性,导致加载/序列化的数据超出预期

    为了解决这个问题,我建议在做任何能使数据进入状态的事情之前,先投影到一个简单的DTO模型(所以你知道 确切地 您正在序列化哪些数据),并仔细查看正在处理的行数(使用 Take Where 适当地)。