2016-02-10 1 views
-1

j'ai code suivant:insert EF6 ou mise à jour pour la collecte des entités

using (var context = new DataContext()) 
{ 
    var dbHistoryItems = context.Set<HistoryItem>(); 

    var historyItems = history as HistoryItem[] ?? history.ToArray(); 
    var historyItemIds = historyItems.Select(c => c.Id); 

    var existingEntities = dbHistoryItems.Where(h => historyItemIds.Contains(h.Id)); 
    if (existingEntities.Any()) 
    { 
     var newEntities = historyItems.Where(h => !existingEntities.Select(e => e.Id).Contains(h.Id)); 
     dbHistoryItems.AddRange(newEntities); 
    } 
    context.SaveChanges(); 
} 

history est le paramètre d'entrée List<HistoryInfo>

Lorsque l'entité est nouvelle (entité ID n'existe pas dans le contexte) ajouter au contexte. Quand l'entité est existante - je veux juste la sauvegarder (elle peut être modifiée).

Problème dans ce code avec la mise à jour. Il ne met pas à jour les entités existantes.


UPD:

est-il le meilleur moyen d'insérer ou d'une collection d'entités puis en boucle comme mise à jour:

foreach(var item in collection) 
{ 
    db.AddOrUpdate(item); 
} 
db.SaveChanges; 
+0

Vous ne modifiez aucune propriété. D'où vient l'histoire et quelles mises à jour vous attendez-vous? – CodeCaster

+0

Et non, _ "l'historique est la liste des paramètres d'entrée " _ ne clarifie pas cela. Est-ce une entité détachée, par exemple à travers un formulaire POST MVC? – CodeCaster

Répondre

1

Il semble que EF ne détecte pas les changements dans les éléments du tableau. Vous pouvez cependant forcer la mise à jour. Cochez Entity Framework 5 Updating a Record

+0

Que veut dire _ "EF ne détecte pas les modifications dans les éléments du tableau"? En outre, si vous pensez qu'une question est répondue ailleurs, signalez-la en double, s'il vous plaît. – CodeCaster

+0

@CodeCaster Par exemple, le type sql 'varbinary' serait' byte [] 'dans EF. Changer certains éléments du tableau 'byte []' et appeler 'SaveChanges' ne détectera pas que le contenu du tableau a été modifié et ne sera pas mis à jour. –

+0

C'est vrai, vous devrez ré-assigner une propriété 'byte []' sur une entité ou la marquer explicitement comme modifiée pour que le tracker de changement puisse prendre cette modification, mais je ne vois pas vraiment comment cela se rapporte à la question ici. – CodeCaster