none
DbContext disposed RRS feed

  • Question

  • [22 nov : Qu'est-ce qui peut bien fermer db ?]

    Bonjour tout le monde,

    Je reprends l'atelier Movies dont j'ai développé le site MVC EF Code First voici un paquet de mois, et qui fonctionnait très bien.

    J'ai à présent un problème sur la page SelectIndex, avec ce code :

        var genreList = new List<string>();
        var genreQuery = (from d in db.Movies
                         orderby d.Genre
                         select d.Genre).Distinct();
        genreList.AddRange(genreQuery);

    Sur la dernière ligne on me dit "The operation cannot be completed because the DbContext has been disposed".

    Exited, le DbContext. Et encore au départ le Distinct() se trouvait sur la ligne de AddRange, je l'ai déplacé pour tenir compte d'une réponse que j'ai trouvée à une question analogue à celle-ci.

    Même erreur si dans la fenêtre immédiate je tape ceci :

    ? db.Movies.Count()


    Rien de mieux comme ceci :

                if (db == null)
                {
                    db = new dbMovieContext(); 
                }
                genreList.AddRange((from d in db.Movies
                                    orderby d.Genre
                                    select d.Genre).Distinct());

    Ah d'ailleurs db n'est pas nul donc ce n'est pas le bon test, mais je n'en ai pas trouvé de plus judicieux. db.Configuration retourne ceci :

    {System.Data.Entity.Infrastructure.DbContextConfiguration}
        AutoDetectChangesEnabled: true
        LazyLoadingEnabled: true
        ProxyCreationEnabled: true
        ValidateOnSaveEnabled: true

    toutes les autres propriétés et méthodes de db retournent une erreur.

    Pour mémoire, en haut du MovieController, nous avons ceci :

            private static dbMovieContext db = new dbMovieContext();

    Qu'est-ce qui se passe, Entity Framework ne supporte plus l'opération Distinct() ? Si je l'enlève ça fonctionne mais bien entendu j'ai plusieurs fois chaque genre dans la liste.







    • Modifié Gloops dimanche 22 novembre 2015 11:33
    vendredi 20 novembre 2015 08:46

Réponses

  • Bon, finalement, ce n'est pas exactement le même sujet que celui pour lequel j'ai lu une réponse.

    J'ai déclaré db dans la procédure ActionResult, et ça marche très bien.

    Qu'est-ce qui a bien pu le fermer ?

            public ActionResult SearchIndex(string SearchString = "", string id = "", string movieGenre = "")
            {
                defculture();
                dbMovieContext db = new dbMovieContext();
               try
                {
                    var genreQry = from m in db.Movies where m.Genre != "" select m.Genre;
                    var genreLst = new List<string>();
                    genreLst.Add("-");
                    genreLst.AddRange(genreQry.Distinct());
    
                    ViewBag.MovieGenre = new SelectList(genreLst);
    
                    var movie = from m in db.Movies select m;
                    if (SearchString == "" && id != "") SearchString = id;
                    if (SearchString != "") movie = movie.Where(m => m.Title.Contains(SearchString));
    
                    if (movieGenre != "" && movieGenre != "-") movie = movie.Where(m => m.Genre == movieGenre);
                    if (movieGenre == "-")movie = movie.Where(m => m.Genre.Trim() == "");
                    return View(movie);
                }
                catch (Exception exSI)
                {
                    ViewBag.MsgErr = exSI.Message;
                }
                return View();
            }


    • Modifié Gloops vendredi 20 novembre 2015 09:55
    • Marqué comme réponse Emile Supiot jeudi 3 décembre 2015 13:58
    vendredi 20 novembre 2015 09:54