web-dev-qa-db-fra.com

Solution pour: L'instruction de mise à jour, d'insertion ou de suppression de magasin a affecté un nombre inattendu de lignes (0)

J'ai trouvé une solution pour les personnes ayant une exception:

L'instruction Store update, insert ou delete a affecté un nombre inattendu de lignes (0). Des entités peuvent avoir été modifiées ou supprimées depuis le chargement d'entités. Actualiser les entrées de ObjectStateManager.

Mais, de toute façon j'ai une question. 

J'ai lu le sujet: Entity Framework: "L'instruction de mise à jour, d'insertion ou de suppression de magasin a affecté un nombre inattendu de lignes (0)."To VMAtm, Robert Harvey

Dans mon cas, j'avais par exemple des articles de table:

Articles
------------
article_id
title
date_cr
date_mod
deleted

Et j'ai eu la gâchette:

create trigger articles_instead_of_insert 
on articles instead of insert 
as      
    SET NOCOUNT ON;
    insert into articles(
        article_id, 
        title, 
        date_cr,
        date_mod, 
        deleted
    )
    select 
        user_id, 
        title, 
        isnull(date_cr, {fn NOW()}),
        isnull(date_mod, {fn NOW()}),
        isnull(deleted, 0)
    from inserted;
go

Lorsque je supprime ce déclencheur, je ne reçois pas cette exception. Donc, ce déclencheur est un problème. Et maintenant j'ai une question - Pourquoi? Devrais-je faire quelque chose?

22
nosbor

Solution:

try {
    context.SaveChanges();
} catch (OptimisticConcurrencyException) {
    context.Refresh(RefreshMode.ClientWins, db.Articles);
    context.SaveChanges();
}
37
nosbor

Il vaut mieux mettre à jour votre méthode de sauvegarde comme ceci ..... Si vous appelez la méthode savechange() du contexte de l'entité après chaque objet addobject et deleteobject ou modification:

public void Save(object entity)
{
    using (var transaction = Connection.BeginTransaction())
    {
        try
        {
            SaveChanges();
            transaction.Commit();
         }
         catch (OptimisticConcurrencyException)
         {
             if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                    this.Refresh(RefreshMode.StoreWins, entity);
              else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                    Detach(entity);
              AcceptAllChanges(); 
              transaction.Commit();
          }

    }
}
5
Prem Prakash

C'est parce que vous avez SET NOCOUNT ON.
L’instruction SQL EF qu’elle génère génère TOUJOURS une clause de where @@ROWCOUNT > 0 and [ID] = scope_identity() (par exemple).
Notez la clause where @@ROWCOUNT > 0. Enlevez votre déclaration SET NOCOUNT ON et cela devrait fonctionner.

3
Tim

Problème possible: Vous avez placé un ReadOnlyAttribute dans les métadonnées de votre clé d'entité, ce qui a pour effet de rendre sa valeur nulle.

 [DisplayName("Student ID")]
 [ReadOnly(true)]
 public int StudentID { get; set; }

Solution: Supprimer le ReadOnlyAttribute

 [DisplayName("Student ID")]
 public int StudentID { get; set; }
1
Jboy Flaga

J'ai eu le même problème, ce message d'erreur est plutôt mystificateur. La réponse de webtrifusion m'a aidé. Voir Entity Framework: "L'instruction de mise à jour, d'insertion ou de suppression du magasin a affecté un nombre inattendu de lignes (0)."

Il s'avère que j'ai oublié d'ajouter "Id: 0" dans le JSON côté client.

1
binjiezhao

J'ai eu InsertAsync paramètre EntityState à modifié implémentant un modèle de référentiel . Lors du débogage, j'ai repéré le l'identifiant de l'entité était 0 

    public async Task InsertAsync(T entity)
    {

        dbContext.Entry(entity).State = EntityState.Modified;
        await dbContext.SaveChangesAsync();
    }

Changer l'état de l'entité en ajouté l'a corrigé.

    dbContext.Entry(entity).State = EntityState.Added;
1
lloyd

J'ai eu la même erreur puis j'ai réalisé que j'avais oublié la clé primaire définie dans la table et la définition des valeurs d'incrémentation 

0

J'ai trouvé cette erreur lorsque j'ai mis à jour l'entité Et j'ai oublié de transmettre la valeur de la clé primaire ....

Donc, l'entité peut mettre à jour l'enregistrement avec référence avec clé primaire

Solution: Vérifiez si la valeur de la clé primaire est transmise ou non pour mettre à jour l'enregistrement donné. :)

0
Prashant J