Ошибка: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения - PullRequest
2 голосов
/ 28 июня 2011

Я использую asp.net и EF 4 в C #.

У меня есть 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. 

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

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

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

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

2 голосов
/ 28 июня 2011

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

...