错误:ObjectContext实例已被释放,不能再用于需要连接的操作

时间:2011-06-28 09:35:48

标签: c# entity-framework entity-framework-4 linq-to-entities objectdatasource

我在C#中使用asp.net和EF 4。

我有一个与ObjectDataSource关联的DetailsView。

<asp:ObjectDataSource ID="uxEntityDataSourceAuthors" runat="server" 
        SelectMethod="GetAuthors" 
        TypeName="WebProject.Web.Cms.AdminCms.Sections.CmsContents.ContentInformation">
    </asp:ObjectDataSource>

这是方法的代码:


    public IEnumerable<CmsAuthor> GetAuthors()
    {
    if (Roles.IsUserInRole("CMS-AUTHOR"))
    {
    using (CmsConnectionStringEntityDataModel context = new CmsConnectionStringEntityDataModel())
    {
                            // Display all Authors for specific logged-in User.
                            // Get Guid for current logged-in User.
                            MembershipUser myLoggedinUser = Membership.GetUser();
                            Guid myUserGuid = (Guid)myLoggedinUser.ProviderUserKey;
                            // Get list of Authors filtering my current logged-in User.
                            var myAuthorsForAuthor = from a in context.CmsAuthors
                                                     where a.UserId == myUserGuid
                                                     orderby a.LastName ascending
                                                     select a;
                            return myAuthorsForAuthor.AsEnumerable();
                        }
                    }
                    return null;  
 }

当我运行代码时,我收到此错误:

 The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

知道我做错了什么以及如何解决它?

2 个答案:

答案 0 :(得分:5)

在获取数据之前,您正在关闭名为CmsConnectionStringEntityDataModel的{​​{1}}。请记住,context将返回 lazy 枚举器,当您返回并处理`context时,没有从源中读取数据。

使用AsEnumerable()(或ToArray())确保在关闭源代码之前将数据存入内存。

答案 1 :(得分:2)

调用AsEnumerable不会枚举它只是将其从IQeuryable<T>更改为IEnumerble<T>的集合。在从数据库中提取数据之前,您将处置ObjectContext。使用ToList()枚举集合并获取数据。