我在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.
知道我做错了什么以及如何解决它?
答案 0 :(得分:5)
在获取数据之前,您正在关闭名为CmsConnectionStringEntityDataModel
的{{1}}。请记住,context
将返回 lazy 枚举器,当您返回并处理`context时,没有从源中读取数据。
使用AsEnumerable()
(或ToArray()
)确保在关闭源代码之前将数据存入内存。
答案 1 :(得分:2)
调用AsEnumerable不会枚举它只是将其从IQeuryable<T>
更改为IEnumerble<T>
的集合。在从数据库中提取数据之前,您将处置ObjectContext。使用ToList()
枚举集合并获取数据。