绑定时已释放ObjectContext实例

时间:2010-08-20 10:22:02

标签: c# .net entity-framework exception-handling

这是我的代码:

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 个答案:

答案 0 :(得分:5)

是的,你必须在返回之前转换为一些内存中的集合。问题是返回的结果序列是延迟评估的,因此在数据源尝试枚举结果之前不会尝试查询数据库。此时ObjectContext已被处置。

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

答案 1 :(得分:0)

using子句在View能够使用它之前处理你的ObjectContext。 解决方案是删除using子句并按如下方式更改代码:

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