J'essaie de mettre à jour l'enregistrement en utilisant EF6. Si vous trouvez d'abord l'enregistrement, s'il existe, mettez-le à jour. Voici mon code: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Chaque fois que j'essaie de mettre à jour l'enregistrement en utilisant le code ci-dessus, j'obtiens cette erreur: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: l'instruction de mise à jour, d'insertion ou de suppression de magasin a affecté un nombre inattendu de lignes (0). Les entités peuvent avoir été modifiées ou supprimées depuis le chargement des entités. Actualiser l'entrée ObjectStateManager
c#
entity-framework
entity-framework-6
ef-database-first
user1327064
la source
la source
catch (Exception ex){throw;}
est redondant et vous pouvez le supprimer complètement.Réponses:
Vous essayez de mettre à jour l'enregistrement (ce qui signifie pour moi "modifier une valeur sur un enregistrement existant et le sauvegarder"). Vous devez donc récupérer l'objet, apporter une modification et l'enregistrer.
la source
db.SaveChanges()
avec des objets modifiés dans le contexte met à jour la base de données.SaveChanges
le contexte, il évalue tous les objets qu'il suit pour déterminer s'ils sont ajoutés, modifiés ou supprimés et envoie le code SQL approprié à la base de données connectée.J'ai examiné le code source d'Entity Framework et trouvé un moyen de mettre à jour une entité si vous connaissez la propriété Key:
Sinon, vérifiez l' implémentation AddOrUpdate pour des idées.
J'espère que cette aide!
la source
SaveChanges()
appel est requis après la définition des valeurs.Vous pouvez utiliser la
AddOrUpdate
méthode:la source
.AddOrUpdate()
est utilisé lors de la migration de la base de données, il est fortement déconseillé d'utiliser cette méthode en dehors des migrations, d'où sa raison d'être dans l'Entity.Migrations
espace de noms.AddOrUpdate()
méthode est destinée aux migrations et ne convient pas aux situations où vous n'avez besoin que de mettre à jour la ligne existante. Si vous n'avez pas de livre avec une référence de recherche (c'est-à-dire un ID), cela créera une nouvelle ligne et cela peut être un problème dans les cas (par exemple, vous avez une API qui doit vous renvoyer une réponse 404-NotFound si vous essayez d'appeler la méthode PUT pour une ligne non existante).Vous avez donc une entité qui est mise à jour, et vous souhaitez la mettre à jour dans la base de données avec le moins de code ...
La concurrence est toujours délicate, mais je suppose que vous voulez juste que vos mises à jour gagnent. Voici comment je l'ai fait pour mon même cas et modifié les noms pour imiter vos classes. En d'autres termes, changez simplement
attach
enadd
, et cela fonctionne pour moi:la source
Vous devez utiliser la méthode Entry () dans le cas où vous souhaitez mettre à jour tous les champs de votre objet. Gardez également à l'esprit que vous ne pouvez pas modifier l'ID de champ (clé), définissez donc d'abord l'ID sur le même que vous modifiez.
la source
Ce code est le résultat d'un test pour mettre à jour uniquement un ensemble de colonnes sans effectuer de requête pour renvoyer l'enregistrement en premier. Il utilise d'abord le code Entity Framework 7.
Voici le code complet:
la source
Pour le noyau .net
la source
Voici la meilleure solution pour ce problème: dans la vue, ajoutez tous les ID (clés). Envisagez de nommer plusieurs tables (première, deuxième et troisième)
En code C #,
la source
Attach
Une entité définira son état de suivi surUnchanged
. Pour mettre à jour une entité existante, il vous suffit de définir l'état de suivi surModified
. Selon les documents EF6 :la source
la source
J'ai trouvé un moyen qui fonctionne très bien.
la source
Vous devez supprimer
db.Books.Attach(book);
la source
Voici ma méthode de mise à jour d'entité post-RIA (pour la période Ef6):
Notez que
FrameworkTypeUtility.SetProperties()
c'est une petite fonction utilitaire que j'ai écrite bien avant AutoMapper sur NuGet:la source
Comme l'a dit Renat, supprimez:
db.Books.Attach(book);
Modifiez également votre requête de résultat pour utiliser "AsNoTracking", car cette requête supprime l'état du modèle du framework d'entité. Il pense que "résultat" est le livre à suivre maintenant et vous ne voulez pas cela.
la source
Essayez-le ....
UpdateModel (livre);
la source
Je sais qu'il a déjà été répondu à plusieurs reprises, mais j'aime la façon de procéder ci-dessous. J'espère que cela aidera quelqu'un.
la source
C'est le cas pour Entity Framework 6.2.0.
Si vous avez un
DbSet
élément spécifique et un élément qui doit être mis à jour ou créé:Cependant, cela peut également être utilisé pour un générique
DbSet
avec une seule clé primaire ou une clé primaire composite.la source