0

J'ai une table de base de données SQL qui joint deux autres tables.Comment mettre à jour la table non importée par EDMX dans le projet C#

Classes (tableau 1), étudiants (tableau 2).

La table jointe est appelée StudentClasses ressemble à: 1 Composite clé primaire composée de 2 colonnes: StudentID (à partir des étudiants), ClassID (de classes)

Quand j'ajoute ma base de données à mon projet C# par ADO. Première approche de la base de données d'infrastructure NET EDMX, cette table jointe n'est pas ajoutée en tant que fichier cs de classe générée automatiquement, je suppose parce qu'elle est composée de deux clés étrangères.

Il est cependant ajouté à mes informations XML EDMX (voir ci-dessous extrait d'EDMX).

Mon problème est que cette table contient les informations pour tout étudiant étant inscrit à un cours. Donc, si l'étudiant doit être désinscrit ou inscrit pour une classe basée sur l'entrée de l'utilisateur dans mon application, je ne peux pas mettre à jour la base de données via DbContextInstance.StudentClasses.Add (studentClassObject) ou DbContextInstance.StudentClasses.Add (studentClassObject).

Y a-t-il un autre moyen de mettre à jour cette table dans mon code C#?

Ma classe Student possède une propriété pour Student.Classes, ce qui me permet de manipuler ces données dans mon programme, mais pas de les pousser dans la base de données (pour autant que je sache).

J'apprécie toute aide! Ci-dessous le code XML qui montre que l'ADO.NET/EDMX est conscient de la table, bien qu'il ne crée pas de classe .cs générée automatiquement par l'entité.

<EntityType Name="StudentClasses"> 
      <Key> 
      <PropertyRef Name="StudentID" /> 
      <PropertyRef Name="ClassID" /> 
      </Key> 
      <Property Name="StudentID" Type="int" Nullable="false" /> 
      <Property Name="ClassID" Type="int" Nullable="false" /> 
</EntityType> 

[...]

<EntitySet Name="StudentClasses" EntityType="Self.StudentClasses" Schema="dbo" store:Type="Tables" /> 

[...]

<Association Name="StudentClasses"> 
      <End Role="Classes" Type="Self.Class" Multiplicity="*" /> 
      <End Role="Students" Type="Self.Student" Multiplicity="*" /> 
</Association> 

[...]

<AssociationSet Name="StudentClasses" Association="Self.StudentClasses"> 
      <End Role="Classes" EntitySet="Classes" /> 
      <End Role="Students" EntitySet="Students" /> 
</AssociationSet> 

[...]

<AssociationSetMapping Name="StudentClasses" TypeName="ClassroomSchedulerModel.StudentClasses" StoreEntitySet="StudentClasses"> 
      <EndProperty Name="Classes"> 
       <ScalarProperty Name="ClassID" ColumnName="ClassID" /> 
      </EndProperty> 
      <EndProperty Name="Students"> 
       <ScalarProperty Name="StudentID" ColumnName="StudentID" /> 
      </EndProperty> 
</AssociationSetMapping> 
+0

entité Les classes doivent avoir des étudiants collection et quand vous ajoutez de nouveaux étudiants à cette collection et économisez changements, il devrait ajouter un nouvel enregistrement à la table StudentClasses.Vous n'avez pas besoin d'accéder directement. Vous pouvez également vérifier le lien suivant http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx – Miguel

+1

Vous avez raison, le fichier auto-généré entité de classe possède également une collection Students: "public virtual ICollection Students {get; set;}" – zig

Répondre

0

Oui, il y a, ce tableau dans le cadre de l'entité est juste la navigation comme ef est assez intelligent pour détecter qu'il est juste une table de section, le tableau sera représenté par entité, de sorte que pour chaque étudiant, vous aurez

virtual Collection<Class> Classes

qui représente toutes les classes pour cet étudiant, et vice versa, chaque classe aura virtual Collection<Student> Students qui représente tous les élèves de cette classe.

pour modifier ceux-ci vous devez faire quelque chose comme ça

// db is your database context 
//Get Student 
    var theStudent= db.Students.FirstOrDefault(x => x.id == studentid); 
//Get Class, include students with it 
var theClass = db.Classes.Include(x => x.Students).FirstOrDefault(x => x.id == classid); 
//Update Students collection of this class, add or remove 
theClass.Students.Add(theStudent); 
//or remove 
theClass.Students.Remove(theStudent); 

//save changes 
db.SaveChanges(); 
// off topic but good to know 
// you can also do things like this, get classes of this student 
var ClassesStudent = db.Classes.where(x => x.Students.Any(s => s.id == studentid)); 
// or the Students of this Class 
var StudentsClass = db.Students.Where(x => x.Classes.Any(c => c.id == classid)); 

J'espère que c'est ce que vous cherchez