IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Données de database manquantes à la lecture


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut Données de database manquantes à la lecture
    Bonjour,

    Je travaille sur une messagerie type plateforme de ventes.
    Un acheteur peut contacter un vendeur au sujet d'un produit.
    Son message concerne un produit en particulier.
    L'échange de messages n'est possible qu'entre un acheteur et le propriétaire du produit, et concernera uniquement le produit en question.

    Les échanges sont enregistrés en DB.

    Model :
    User_Exp, User_Dest et Article sont des Foreign Key
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        public class MessagesModel
        {
            public long Id { get; set; }
            public ApplicationUser User_Exp { get; set; }
            public ApplicationUser User_Dest { get; set; }
            public Articles Article { get; set; }
     
            public string Message { get; set; }
            public messageStatus Status { get; set; }
            public DateTime Created_at { get; set; }
            public enum messageStatus
            {
                Sent,
                Delivered
            }
            public MessagesModel()
            {
                Status = messageStatus.Sent;
            }
        }
    Au chargement de la vue "Messages", je récupère l'historique des échanges :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            function getChat() {
                $.ajax({
                    url: '@Url.Action("ConversationWithContact", "Messagerie")',
                    type: 'GET',
                    cache: false,
                    data: {articleId:  '@Html.DisplayTextFor(model => model.Id)'},
                })
                    .done( function(resp) {
                    var chat_data = resp.data || [];
                    loadChat( chat_data );
                    });
            };
    Le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
            public JsonResult ConversationWithContact(long articleId)
            {
                ApplicationUser currentUser = _repo.GetUser();
                Articles item = _repo.GetArticleByID(articleId);
     
                var conversations = new List<Models.Messages.MessagesModel>();
     
                conversations = _context.Messages.
                                      Where(c => (c.Article.Id == item.Id)
                                      && (c.User_Dest.Id == currentUser.Id ||
                                      c.User_Exp.Id == currentUser.Id))
                                      .OrderBy(c => c.Created_at)
                                      .ToList();
     
                return Json(new { status = "success", data = conversations });
            }
    C'est là que le problème arrive.
    Pour l'exemple j'ai 2 users, Titi et Toto, et un vendeur.
    Titi et Toto ont envoyé chacun un message au vendeur concernant le même produit.

    "conversations" renvoie une valeur NULL pour User_Exp alors que la valeur est présente dans la DB.
    Le problème se produit dans le controller.

    Nom : SharedScreenshot_BdD.jpg
Affichages : 57
Taille : 48,3 Ko

    Cela se produit pour chaque message pour lequel le user qui utilise la messagerie n'est pas l'expéditeur.


    Quand c'est le DESTINATAIRE (en l’occurrence le propriétaire du produit) qui utilise la messagerie, chaque User_Exp est NULL.
    Nom : Conversation_via LEC.jpg
Affichages : 52
Taille : 89,0 Ko

    Pour Titi, c'est les messages de Toto qui ont user_Exp = NULL.
    Nom : Conversation_via TITI.jpg
Affichages : 53
Taille : 80,9 Ko

    Et pour Toto, ce sont ceux de Titi :
    Nom : Conversation_via TOTO.jpg
Affichages : 53
Taille : 85,3 Ko

    J'ai absolument besoin de l'info user_Exp pour ensuite trier les messages.

    Je n'arrive pas à comprendre ce problème.
    C'est peut-être juste un problème de logique, mais je ne le comprends pas.
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut
    Je précise qu'en modifiant et simplifiant la requête cela ne change rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                conversations = _context.Messages.
                                      Where(c => c.Article.Id == item.Id)
                                      .OrderBy(c => c.Created_at)
                                      .ToList();
    Renvoie le même problème.

  3. #3
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut
    Une piste à laquelle je pense :
    Un user ne doit pas être autorisé à obtenir des infos (son nom via son id) d'un autre user.
    Cela peut expliquer pourquoi seul l'info "user_Exp" du user consultant la DB est affiché.

    Si c'est ça, c'est embêtant.
    Comment deux users peuvent alors réussir à communiquer ?

    Edit 1[ Néanmoins, Titi et Toto obtiennent tous deux l'info "user_Dest" du vendeur ]

    Edit 2
    Voici le code d'enregistrement des données du controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
            [HttpPost]
            public JsonResult SendMessage(long? ItemId, string msg)
            {
                var item = _repo.GetArticleByID(ItemId);
                var currentUser = _repo.GetUser();
                var Other_User = _repo.GetUser_By_ID(item.ApplicationUserId).Result;
     
                MessagesModel convo = new MessagesModel
                {
                    User_Exp = currentUser,
                    Message = msg,
                    User_Dest = Other_User,
                    Article = item,
                    Created_at = DateTime.Now,
                };
                _context.Messages.Add(convo);
                _context.SaveChanges();
     
                return Json(convo);
            }
    et les méthodes du Repository appelées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
            public Articles GetArticleByID(long? articleId)
            {
                return _context.Articles.
                    Include(a => a.User)
                    .FirstOrDefault(x => x.Id == articleId);
            }
     
            public ApplicationUser GetUser()
            {
                var userId = _httpContextAccessor.HttpContext.User.GetLoggedInUserId<string>(); // Specify the type of your UserId;
                ApplicationUser appUser = _context.Users.FirstOrDefault(x => x.Id == userId);
     
                return appUser;
            }
     
            public async Task<ApplicationUser> GetUser_By_ID(string? Id)
            {
                ApplicationUser user = await _userManager.FindByIdAsync(Id);
                return user;
            }

  4. #4
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut
    Aujourd'hui, la requête a levé une exception :

    Nom : Exception.jpg
Affichages : 18
Taille : 131,8 Ko

    Le message suggère de se renseigner sur
    DbContextOptionsBuilder.EnableSensitiveDataLogging
    , et comme on peut le constater plusieurs données sont manquantes dans le retour envoyé par la requête.
    J'ai trouvé cela assez intrigant pour en garder trace.
    Je ne comprends rien du tout au message.

    En relançant simplement l'appli l'exception a disparu.

    En faisant une recherche, cette exception serait à relier à un autre message :
    System.InvalidOperationException : L'instance de type d'entité « » ne peut pas être suivie, car une autre instance avec la valeur de clé « {Id: 5} » est déjà suivie. Lorsque vous attachez des entités existantes, assurez-vous de n'attacher qu'une seule instance d'entité avec une valeur de clé donnée.
    Que je ne comprends pas davantage.
    Dans mon modèle "Messages" j'ai 2 clés étrangères liées à "ApplicationUser" pour "User_Exp" et "User_Dest".

    Je ne sais pas si c'est une piste ou pas.

  5. #5
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut
    J'ai renommé User_Exp en UserExp et User_Dest en UserDest.


    J'ai également essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                _context.Messages.Include(c => c.UserExp);
                _context.Messages.Include(c => c.UserDest);
                conversations = _context.Messages.
                                      Where(c => (c.Article.Id == item.Id)
                                      && (c.UserDest.Id == currentUser.Id ||
                                      c.UserExp.Id == currentUser.Id))
                                      .OrderBy(c => c.Created_at)
                                      .ToList();
    Sans aucun résultat

  6. #6
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 218
    Par défaut
    Résolu

    Sur conseil c'est cela qu'il fallait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                conversations = _context.Messages
                    .Include(c => c.UserExp)
                    .Include(c => c.UserDest)
                    .Where(c => (c.Article.Id == item.Id)
                        && (c.UserDest.Id == currentUser.Id || c.UserExp.Id == currentUser.Id))
                    .OrderBy(c => c.Created_at)
                    .ToList();
    Toutes les données sont maintenant retournées par la requête.
    Le vendeur voit maintenant les expéditeurs des messages qui lui sont adressés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur sur lecture d'une feuille manquante dans excel
    Par yoyo_le_landais dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 05/10/2012, 12h29
  2. Lecture de valeurs manquantes sous MVS
    Par nunien22 dans le forum Administration et Installation
    Réponses: 3
    Dernier message: 17/09/2008, 17h18
  3. [FPDF] Polices manquantes à la lecture du PDF
    Par tarik1099 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 13/11/2007, 18h38
  4. Réponses: 8
    Dernier message: 25/09/2007, 09h31
  5. lecture de donnes a partir d'un PDF
    Par medhioub.h dans le forum Documents
    Réponses: 2
    Dernier message: 27/07/2007, 16h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo