Impossible de mettre à jour des relations plusieurs à plusieurs dans Entity Framework

J’utilise Entity Framework 4.3 Code First et je ne parviens pas à mettre à jour les relations plusieurs à plusieurs.

J’ai défini les classes suivantes:

public abstract class Entity { [Column(Order = 0)] [Key] public int Id { get; set; } 1541365376 [Column(Order = 1)] public byte[] Version { get; set; } } public class Video : Entity { public ssortingng Title { get; set; } public ssortingng Description { get; set; } public TimeSpan Length { get; set; } public virtual ICollection Coworkers { get; set; } } public class Coworker : Entity { public ssortingng FirstName { get; set; } public ssortingng LastName { get; set; } public virtual ICollection 

Lorsque la firebase database est créée, le schéma est correct: il existe également une table Videos, Coworkers et VideoCoworkers, sans

J’utilise un modèle de référentiel dans une application à plusieurs niveaux pour accéder à une firebase database. Ma méthode d’insertion et de mise à jour se présente comme suit:

 public T Insert(T entity) { //Creates database context. When it disposes, it calls context.SaveChanges() using (var session = new DatabaseSession()) { session.Context.Set().Add(entity); } } public T Update(T entity) { //Creates database context. When it disposes, it calls context.SaveChanges() using (var session = new DatabaseSession()) { entity = session.Context.Set().Attach(entity); session.Context.Entry(entity).State = EntityState.Modified; } return entity; } 

Lorsque je mets à jour une entité, je crée l’object entité à partir d’un DTO, c’est pourquoi utilisez DbSet.Attach au lieu de le sélectionner et de mettre à jour les propriétés une par une.

Lorsque j’initialise la firebase database, j’ajoute des données de test:

  1. Créez 3 collaborateurs, où je mets le nom et le prénom. (A, B, C)
  2. Créez 3 vidéos, dans lesquelles je définis le titre, la description et la longueur, ainsi que des collègues. La première vidéo a A, B, la deuxième a B, C et la troisième a A, C.

Lorsque je répertorie les vidéos à partir de code, je constate que la collection Video.Coworkers contient de bonnes valeurs. Lorsque j’interroge la table de liens (VideoCoworkers) dans SQL Server Management Studio, elle a également une apparence intéressante.

Mon problème est que lorsque je mets à jour, par exemple, le titre de la vidéo, cela fonctionne. Mais lorsque j’essaie de supprimer de Video2 les collègues existants (B et C) et d’essayer d’append un collègue A, la relation n’est pas mise à jour. Cela ne fonctionne pas non plus lorsque j’essaie seulement d’append un nouveau collègue ou d’essayer d’en supprimer un. Je crée l’entité qui est utilisée comme paramètre de la méthode Update () en créant une nouvelle entité Video avec une nouvelle collection de Coworkers (sélectionnés dans la firebase database avec la méthode Find () par Id).

Quelle est la bonne façon de mettre à jour des relations plusieurs à plusieurs?

Mais lorsque j’essaie de supprimer de Video2 les collègues existants (B et C) et d’essayer d’append un collègue A, la relation n’est pas mise à jour.

Sans utiliser un référentiel générique, la procédure correcte serait la suivante:

 using (var session = new DatabaseSession()) { video2 = session.Context.Set 

La partie essentielle est que vous devez charger ou attacher l’entité dans son état d’origine, modifier l’entité, c’est-à-dire supprimer et append des enfants, puis enregistrer les modifications. La détection de changement par EF créera les instructions INSERT et DELETE nécessaires pour les entrées de la table de liens. La procédure simple pour définir l’état que vous essayez sur Modified dans votre méthode de Update générique convient uniquement pour la mise à jour des propriétés scalaires, comme le changement du titre vidéo, mais ne fonctionne pas pour la mise à jour des relations entre les entités.

Pour résoudre ce problème:

  1. attache l’entité au contexte
  2. charger la collection (la collection n’est pas chargée, car)
  3. changer l’état de l’entité à modifié
  4. Sauvegarder les modifications

Donc, votre code de mise à jour devrait être comme ceci:

 public Video Update(Video entity) { //Creates database context. When it disposes, it calls context.SaveChanges() using (var session = new DatabaseSession()) { entity = session.Context.Set 

Veuillez vous référer ici pour voir comment sauvegarder les détails principaux dans asp.net mvc avec la firebase database en premier. J’espère que cela vous donnera d’abord une idée du code. Vous pouvez également consulter l’exemple de knokout.js