ObjectContext实例已被释放,而绑定时出现了问题。

4
这是我的代码:
public class JobsRepository:BaseNewsletterRepository
{
   public IEnumerable<Job> GetJobs()
   {
        var jobs = Newsletterctx.Jobs.Include("Info").OrderBy(o => o.JobID);             
        return jobs.AsEnumerable();
   }
}

public class BusinessNewsletter
{
   public static IEnumerable<Job> GetJobs()
   {      
        using (JobsRepository jobsRepository = new JobsRepository())
        {
            return  jobsRepository.GetJobs();
        }    
    }
}    

rptJobs.DataSource = BusinessNewsletter.GetJobs();
rptJobs.DataBind();

当我尝试进行绑定时,出现错误:

ObjectContext 实例已被处理并且不再可用于需要连接的操作。

唯一的解决方案是,在 BusinessNewsletter 类中进行强制类型转换并返回 List 吗?

public static IList<Job> GetJobs()
{
    IList<Job> job;
    using (JobsRepository jobsRepository = new JobsRepository())
    {
        job = jobsRepository.GetJobs().ToList();
    }
    return job;
}

另一个相关的问题:

如何在不指定特定类型(List<type>IEnumerable<type>)的情况下检索并绑定数据到重复器?
我需要在返回特定对象的情况下使用它,就像这样:

var specificJob = from job in Newsletterctx.Jobs.Include("Info")
                  select new
                  {
                      ID = job.JobID,
                      EmailId = job.Info.PreparedEmailID
                  };

我需要创建一个特定的类来处理那个对象吗?
2个回答

5

是的,在返回之前你必须将其转换为某种内存集合。问题在于返回的结果序列是惰性求值的,因此在数据源尝试枚举结果之前不会尝试查询数据库。此时 ObjectContext 已经被释放。

对于你的第二个问题,你应该创建自己的类,因为你不能从声明它们的方法返回匿名类型。


我有一个使用匿名类型的代码,运行得非常完美... - Azimuth

0

使用using语句会在视图使用ObjectContext之前将其释放。解决方案是删除using语句并按照以下方式更改代码:

  JobsRepository jobsRepository = new JobsRepository();
  return  jobsRepository.GetJobs();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接