3 votes

Entity Framework code first already open data reader ?

J'ai ajouté une méthode simple à une entité de mon application appelée TopicCount qui accepte un booléen. Il compte le nombre d'éléments dans une propriété de navigation et le compte est filtré différemment selon que le booléen passé est vrai ou faux.

public class Board
{
    public short BoardID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Hidden { get; set; }
    public bool ModsOnly { get; set; }
    public bool Locked { get; set; }
    public bool Anonymous { get; set; }
    public bool AllTopics { get; set; }

    public virtual ICollection<Topic> Topics { get; set; }

    public long TopicCount(bool isModerator)
    {
        if (isModerator)
            return this.Topics.ToList().Count;
        else
            return this.Topics
                .Where(x => !x.ModsOnly)
                .Where(x => !x.Board.ModsOnly)
                .Where(x => !x.Board.Hidden)
                .Count();
    }
}

Lorsque j'appelle ce TopicCount elle échoue (que le bool soit vrai ou faux) avec l'erreur suivante :

Un DataReader ouvert est déjà associé à cette commande et doit d'abord être fermé.

Des idées ?

4voto

Julie Lerman Points 2407

Il s'agit également d'un symptôme de la diffusion en continu des résultats de plusieurs commandes sur un seul contexte (comme le chargement paresseux). Vous pouvez définir "MultipleActiveResultSets=True" dans votre chaîne de connexion pour contourner ce problème.

3voto

Alex Ford Points 15277

Je pense que c'est la solution la plus rapide que j'ai jamais trouvée à une question que je m'étais posée. Il s'avère que j'itérais sur une collection chargée paresseusement de Board entités. Dans cette itération, j'ai ensuite itéré sur une propriété de navigation de Board, qui est un autre lecteur de données.

La solution la plus simple consiste à appeler .ToList() sur la collection de planches et itère sur la collection en mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X