2010-08-20 3 views
4

Ceci est mon code:exemple ObjectContext a été disposé tout en se liant

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(); 

Lorsque je tente de lier je reçois l'erreur:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

est la seule solution, de lancer et de retour Liste dans BusinessNewsletter classe?

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

Une autre question connexe:

Comment puis-je récupérer et les données de se lier à un répéteur sans spécifier un type spécifique (List<type> ou IEnumerable<type>)
je en ai besoin dans le cas où je retourne objet spécifique comme this:

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

Je dois créer une classe spécifique juste pour cet objet?

Répondre

5

Oui, vous devrez convertir vers une collection en mémoire avant de revenir. Le problème est que la séquence de résultats renvoyée est évaluée paresseusement, donc aucune tentative n'est faite pour interroger la base de données jusqu'à ce que la source de données tente d'énumérer les résultats. À ce stade, le ObjectContext a déjà été éliminé.

Pour votre deuxième question, vous devez créer vos propres classes car vous ne pouvez pas renvoyer les types anonymes des méthodes qui les déclarent.

+0

J'ai un code avec des types anonymes fonctionne parfaitement ... – Azimuth

0

La clause using dispose votre ObjectContext avant que View puisse l'utiliser. La solution serait de supprimer la clause et changer votre code en utilisant comme suit:

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