Ошибка: экземпляр ObjectContext удален и больше не может использоваться для операций, требующих подключения.

Я использую asp.net и EF 4 на С#.

У меня есть DetailsView со связанным ObjectDataSource.

<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. 

Любая идея, что я делаю неправильно и как это исправить?


person GibboK    schedule 28.06.2011    source источник


Ответы (2)


Вы закрываете CmsConnectionStringEntityDataModel под названием context перед получением данных. Помните, что AsEnumerable() вернет ленивый перечислитель, данные не были прочитаны из источника, когда вы возвращаете и удаляете `context.

Используйте ToArray() (или ToList()), чтобы обеспечить получение данных в память перед закрытием источника.

person Richard    schedule 28.06.2011
comment
Методы списка и массива называются ToList() и ToArray() соответственно. - person Ben Robinson; 28.06.2011
comment
Привет, у меня нет AsArray() (или AsList()), только ToList(). - person GibboK; 28.06.2011

Вызов AsEnumerable не перечисляет коллекцию, а просто изменяет ее с IQeuryable<T> на IEnumerble<T>. Вы избавляетесь от ObjectContext до того, как данные будут извлечены из базы данных. Используйте ToList(), который будет перечислять коллекцию и извлекать данные.

person Ben Robinson    schedule 28.06.2011