4

J'ai un périphérique de classe comme suit.EF comment mettre à jour l'entité contenant la liste d'entités

public class Device 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    public List<Instructions> Instructions { get; set; } 
} 

Maintenant, j'ai une vue qui a des sections liées à l'appareil et la disposition pour ajouter des instructions à l'appareil. Si le périphérique est nouveau, this.context.Devices.Add(device) fonctionne correctement.

mais si je veux éditer l'appareil. Je le trouve par Id. Il est peuplé. et si je change la propriété individuelle, alors cela fonctionne bien. mais je veux mettre à jour tout le dispositif à la fois qui ne se passe pas.

Mon exemple de code est le suivant.

public async Task<bool> AddInstrument(Device device) 
{ 
    try 
    { 
     var newDevice = this.context.Device 
         .Where(i => i.Id == device.Id).FirstOrDefault();// i tried find,single or default also 

     //adding new device 
     if (newDevice == null) 
     { 
      this.context.Device.Add(device); 
      return await this.context.SaveChangesAsync() > 0; 
     } 

     //if editing the device 
     newDevice = device; 
     return await this.context.SaveChangesAsync() > 0; 
    } 
    catch 
    { 
     throw; 
    } 
} 

ce que je veux atteindre.

Problème: - Je souhaite mettre à jour le périphérique correspondant dans la base de données. avec les instructions. par exemple. Auparavant, un périphérique nommé "D22" avait 3 instructions (a1, a2, a3).

mais maintenant le même périphérique a le nom de valeurs "D22_1" et maintenant les instructions sont a1, a3 (mis à jour n'importe quel champ), a2 (supprimé). b1 & a4 sont ajoutés après modification des champs J'ai les instructions comme a1, a2, b1, b4 pour D22_1.

Mon effort: -

Ce que j'ai essayé.

1) Pour le dispositif principal D22 si je spécifie les propriétés explicitement, il est correct, par ex.

device.Name="aaaaa"; 

this.context.savechanges(); 

reflète dans la base de données. Je n'ai pas essayé ceci pour mettre à jour les instructions dans la liste.

2) J'ai essayé d'utiliser

this.context.Entry(device).State = EntityState.Modified; 

mais avec divers succès et procès, je ne pouvais pas l'exécuter. Le mieux que je puisse obtenir est cette erreur "Cela peut se produire lors de l'utilisation de la méthode 'Attach' ou de l'état d'une entité à 'Inchangé' ou 'Modifié' si des entités du graphique ont des valeurs de clé conflictuelles. les entités sont nouvelles et n'ont pas encore reçu .. "

Veuillez nous suggérer quelque chose. En outre, je veux savoir sur diverses techniques liées à la mise à jour des entrées avec la liste dans EF. Je suppose que EF s'occupera automatiquement de l'objet enfant (c'est-à-dire ajout/mise à jour et suppression). Dans mon cas Instructions pour l'appareil.

+0

[Ce message] (http://stackoverflow.com/questions/13236116/entity-framework-problems-updating-related-objects) montre comment mettre à jour la collecte d'une entité. Fondamentalement, il boucle les éléments de la collection et gère trois situations qui peuvent se produire: élément ajouté, élément mis à jour, élément supprimé. –

+1

nouveauDevice = périphérique; c'est le problème: newDevice est dans le contexte, le périphérique ne l'est pas. puisque vous définissez la référence à une autre valeur, EF ne peut plus la suivre. vous devrez définir les attributs un par un ou travailler dans un scénario détaché. – DevilSuichiro

+0

@DevilSuichiro comment puis-je faire ça? travailler dans un scénario détaché – iGod

Répondre

0

Essayez ceci:

this.context.Attach(device); 
this.context.Entry(device).State = EntityState.Modified; 
this.context.SaveChangesAsync(); 
+0

Je reçois cette erreur. La connexion d'une entité de type "Périphérique" a échoué car une autre entité du même type a déjà la même valeur de clé primaire. Cela peut se produire lorsque vous utilisez la méthode 'Attach' ou que vous définissez l'état d'une entité sur 'Inchangé' ou 'Modifié' si des entités du graphique ont des valeurs de clé en conflit. Cela peut être dû au fait que certaines entités sont nouvelles et n'ont pas encore reçu de valeurs de clé générées par la base de données. Dans ce cas, utilisez la méthode 'Add' ou l'état d'entité 'Added' pour suivre le graphique, puis définissez l'état des entités non nouvelles sur 'Inchangé' ou 'Modifié' selon le cas. – iGod

+0

J'ai essayé ceci: -this.context.Device.Attach (newDevice); nouveauDevice = périphérique; this.context.Entry (nouveauDevice) .State = System.Data.Entity.EntityState.Modified; – iGod