linq2sql: Impossible d'ajouter une entité avec une clé qui est déjà en cours d'utilisation
J'ai un linq2sql de l'installation où les objets sont envoyés à partir du côté client (flex via flourinefx) et l'attacher à un nouveau datacontext a vu ci-dessous:
J'ai aussi un "global" datacontext qui est utilisé tout au long de la session.
public static void Update(Enquiry enquiry)
{
OffertaDataContext db = new OffertaDataContext();
db.Enquiries.Attach(enquiry);
db.Refresh(RefreshMode.KeepCurrentValues, enquiry);
db.SubmitChanges();
}
Cette approche fonctionne généralement bien, mais après un certain temps, je reçois le message d'erreur "Impossible d'ajouter une entité avec une clé qui est déjà en cours d'utilisation".
C'est peut-être le moins d'erreur descriptif que j'ai vu mais dans LINQ. Ugh. SQL donne une meilleure erreur dans ce cas? Wow.
OriginalL'auteur Niels Bosma | 2009-01-07
Vous devez vous connecter pour publier un commentaire.
Je pense que cette erreur se produit si vous
Attach
un entité à unDataContext
qui était déjà chargé.Le code qui provoque l'erreur est exactement comme vous montrons ici? Après la création de la nouvelle
OffertaDataContext
ne vous interrogez quoi que ce soit avant laAttach
?OriginalL'auteur bruno conde
Je commençais à cette erreur, et c'était parce que j'avais oublié de définir le champ de Clé Primaire dans la base de données d'Identité "cahier des charges" (auto-increment). Quand j'ai changé de ce que j'étais bon. Doh!
OriginalL'auteur vealer
Peut-être pas votre problème (je ne peux pas dire), mais c'était le mien et que les gens de google ce qu'il pourrait aider quelqu'un d'autre. Si vous n'êtes pas en utilisant le haut-Linq-to-SQL designer ou SQLMetal trucs pour générer votre Linq-to-SQL classes, ou si vous avez oublié de faire votre colonne d'ID d'une IDENTITÉ, vous pourriez manquer une propriété sur votre colonne attribut appelé "IsDbGenerated". Assurez-vous que votre colonne attribut ressemble à quelque chose comme ceci:
OriginalL'auteur mattmc3
Dans le cas où vous l'insertion de plusieurs entités à la fois, peut vous essayez juste d'insérer un double de l'entité en datacontext. Je sais que c'est trop simple, mais c'est juste arrivé à moi-même.
OriginalL'auteur Julio Nobre
Sont que vous essayez d'ajouter plusieurs nouveaux objets dans un coup où la LinqEntities sont créés avec une touche de 0?
J'ai eu ce problème dans le passé, lorsque j'essayais d'ajouter des éléments dans un tableau sur ma page et puis quand j'ai essayé de supprimer ou de mettre à jour ces éléments, les multiples aurait la touche 0. Alors, évidemment, il ne savait pas quoi faire avec mes demandes...
OriginalL'auteur BenAlabaster
C'est ce que j'ai fait pour contourner cette erreur. Fondamentalement, vous avez trouver l'endroit où cette ligne est dans la base de données en fonction d'une clé primaire. S'il n'existe pas alors vous insérer. Sinon, vous obtenez la version de la base de données et mise à jour tous les champs nécessaires.
Cela peut devenir fastidieux si vous faites des mises à jour de votre schéma de base de données tout le temps, vous aurez à revenir ici pour mettre à jour le code.
OriginalL'auteur Noah
J'en ai un similaire à l'approche de Noé, mais je utiliser une procédure stockée pour vérifier si un enregistrement avec PK existe ou pas, de cette façon, l'Entité n'est pas chargé dans le contexte et le code de mise à jour n'implique que deux lignes de code et ne nécessitera pas de modifications dans l'avenir, lorsque vous ajoutez/supprimer des champs de la table, il faudra changer la SP uniquement si le PK de la table de change:
Et voici la procédure stockée:
OriginalL'auteur Manuel Castro
Vous ne devriez pas avoir à faire ce genre de vérification pour voir si vous avez besoin d'utiliser les Mises à jour ou des Inserts - c'est pour Linq to do!
Voici un exemple à partir d'un projet que je suis en train de travailler sur (désolé c'est en VB.Net 🙂 ) qui montre comment résoudre ce problème.
Le code est encore unoptimised et assez laid, mais il obtient le point à travers. Vous pouvez ignorer le peu où il tire les valeurs de la checkboxlist - qui montre comment vous pouvez mettre à jour l'enfant entités.
Voici la OnUpdating méthode, qui englobe la mise à jour (c'est tronquée code):
OriginalL'auteur Joe Niland
essayer ce, même si votre TEntity (ici) ID est un Identifiant de la colonne;
Simplement, sans aucune modification de votre SP ou Modèle:
OriginalL'auteur Bardaan
J'ai eu ce problème après la sélection d'une ligne de la base de données avec la clé primaire de dire "BOB". Alors je tronquer la table avec
dc.ExecuteCommand("TRUNCATE TABLE ShippingReport");
et neSubmitChanges()
, pensant que ce serait de se débarrasser de le domaine et j'aimerais être capable d'insérer un autre avec la même clé, mais j'ai eu l'OP d'erreur lorsque vous essayez d'insérer. Juste eu à fairedc = new DataContext();
après la première SubmitChanges et qu'il fixe pour moi, depuis que l'objet existe toujours dans le DataContext, qui est essentiellement ce que bruno conde de réponse dit.OriginalL'auteur Mikey G
Dans mon cas, c'est arrivé dans une situation où j'avais récupéré une entrée, puis essayé de mettre à jour l'entrée avec une nouvelle entrée. Brainfart pourrait-on dire, ces choses qui se passe si. :p
Devient
OriginalL'auteur Hans Frifelt