0
votes

Mettre à jour les lignes dans la base de données avec LINQ

ASP Core vs mssql strong>

J'ai vérifié de nombreuses réponses pour la question similaire mais n'a pas trouvé de réponse. em> p>

Table étudiante et TABLE DE COURS SONT JOINTES AVEC LE TABLE DE JUNCTION TABLEDYCOURDÈDE: P>

context.SaveChanges();


11 commentaires

s'engager??????????


Qu'est-ce que c'est: oldcoursiddd ?


Juste être pédant d'ici. q dans linq signifie question , il n'y a pas u qui signifie Mettre à jour . En règle générale, nous n'utilisons pas linq pour mettre à jour les choses que nous l'utilisons pour interroger les choses


"Faites des modifications souhaitées aux valeurs des membres dans l'objet LINQ à SQL résultant." Le code que vous avez affiché est simplement pas ne le faisait-il.Où OldCoReidDd vient? Est-ce un "linq résultant à un objet SQL"?


Est-ce vraiment Linq à SQL? Ressemble plus à l'encadrement d'entité pour moi; LINQ to SQL est une chose très différente pour EF et fonctionne uniquement avec SQL Server, alors que vous avez marqué MySQL. Je reçois le sentiment que vous suivez un mauvais tutoriel en lisant cette FAQ; Le code fonctionne pour la requête car EF utilise LINQ, mais ce n'est pas LTS, alors ne suivez pas les tutoriels LTS si vous utilisez ef


@Mongzhu j'ai corrigé. Erreur n'était ici pas ici pas en vrai code dans vs.


@Thegeneral Link On dirait que nous pouvons mettre à jour des lignes, dit Microsoft.


@Caiusjard mon mauvais, typos. La base de données de projet est Microsoft SQL . L'ORM I utilise est le noyau EF.


Avoir une lecture de .


@ M.SAM_NIHAO, ma réponse vous aide-t-elle à résoudre le problème? Si oui, veuillez l'accepter comme une réponse, cela aidera les autres qui ont le même problème, sinon, dites-moi votre problème.


@Yongqingyu ça n'aide pas. Parce qu'il n'y a pas de DBSet dans mon contexte. Donc, je n'ai pas d'accès direct à cette table. J'essaie de faire ce code: StudentModel Student = StudentModel.getStudentByID (StudentID); étudiant.studentcourse.remove (nouvel étudiant-parcours {étudiantid = étudiant.id, ciliacté = oldcourseid}); étudiant.studentcourse.add (nouveau-étudiant {étudiantd = étudiant.id, cours = cours.id}); étudiantmodel.savechanges (); Mais ce code ne supprime pas, mais ajoute un parcours de plus.


3 Réponses :


0
votes

Vous ne devez pas sélectionner les primitives. Ce n'est pas suivi par EF. Vous devez sélectionner l'entité STYENTIFORTYCOURDRE . Ensuite, vous pourrez définir son traite , puis enregistrer les modifications.


5 commentaires

Merci pour votre réponse. Mais le problème est que ma classe de contexte n'a pas d'entité Etudiante comme vous pouvez le voir ci-dessus. J'essaie de changer la ligne dans la table de jonction sans accès direct. Je peux le faire dans SQL Management Studio avec cette commande: Mettre à jour le filidé de jeu d'étudiant = '9A414E30-DA37-48ED-105E-08D8129A967A' Où StudentID = 'A1F38C12-AE65-464C-C489-08D814F4CDDC' Mais Comment le faire en vs? J'ai essayé ce code: context.studentmodels.fromsqlraw ("Mettre à jour StudentCourse Set Setidid = {0} Où StudentId = {1}", Cours.Id, StudentIDForAll); Mais ça ne marche pas aussi bien .


Je comprends que cela ne fonctionne pas parce que j'ai besoin d'utiliser EssayyCourse au lieu de StudentModels . Donc, il semble que je doive utiliser Etudiants entité pour apporter des modifications. Mais il doit y avoir une autre façon de le faire.


EF comprend quand il y a plusieurs entités d'étudiant et de cours qui sont nombreux: beaucoup comment les diviser avec la table du Moyen-homme et que l'étudiant a une liste de cours / cours a une liste d'étudiants. Si vous souhaitez changer de cap sur certains étudiants, supprimer un cours de sa liste et ajoutez un autre cours puis économisez


Naturellement, si vous ajoutez un DBSet pour EtudianteCourse, vous pouvez le manipuler, mais sans cela, vous devez vous charger, par exemple, un étudiant avec tous ses cours, puis retirez celui que vous ne voulez pas et ajoutez celui que vous faites. C'est peut-être ceci c'est le problème; Vous êtes concentré sur essayer de faire une mise à jour; Concentrez-vous sur une Supprimer et insérer à la place; C'est comme ça que vous le feriez dans un sens de l'objet C # (vous allez supprimer un cours et ajouter un autre, vous ne trouverez pas de cours et essayez de changer son identifiant vers celui d'un parcours différent)


@Caiusjard merci. Votre commentaire est très utile.



0
votes

Comme online123321 a écrit: Vous avez besoin d'une entité d'affinement des primitives. Mettez également à jour les requres: xxx pré>

update strong> Entitystate.Modifié n'est plus nécessaire - désolé mon mauvais. P>

Si votre table n'est pas dans un contexte, vous pouvez peut-être essayer d'exécuter SQL directement?: P>

context.Database.ExecuteSqlRaw(query)


2 commentaires

Est-ce vraiment nécessaire? Je pensais que le traqueur de changement a détecté des modifications sur des objets qu'elle avait fournies, et ce type de piratage n'est nécessaire que si (par exemple), vous faites un nouvel objet, mais que je souhaite que EF le traite comme si elle est mise à jour.


Merci. Oui j'ai vu cette réponse aussi. Microsoft dit que ce n'est pas nécessaire. Au moins, je n'ai pas trouvé déclaration opposée.



1
votes

Pour votre relation de table actuelle, si vous souhaitez mettre à jour la table intermédiaire, ma suggestion est de Supprimer les données qui doivent être mises à jour en premier, puis effectuez le fonctionnement de l'ajout de ligne. strong>

Et comme mentionné dans la réponse ci-dessus, vous ne devez pas utiliser la méthode LINQ pour mettre à jour, mais doit être basée sur l'entité de la base de données. P>

Essayez ce code pour atteindre: P>

            var data = context.StudentCourse.Where(x => x.StudentID == studentId  && x.CourseID == oldCourseId).FirstOrDefault();
            context.StudentCourse.Remove(data);
            
           StudentCourse newdata= new StudentCourse()
            {
                StudentID = studentId,
                CourseID = newCourse.Id
            };
            context.StudentCourse.Add(newdata);
            context.SaveChanges();


2 commentaires

Merci de répondre. Le problème est dans mon contexte il n'y a pas de DBSet . C'est le problème.


Enfin, j'ai juste ajouté DBSet .