Le code ci-dessous tente de mettre à jour une ligne dans la base de données, mais jette une exception à la place:LINQ to SQL - DuplicateKeyException lors de la mise à jour
System.Data.Linq.DuplicateKeyException: Cannot add an entity with a key that is already in use
La plupart des exemples que j'ai vu interroger la base pour obtenir une instance de une entité, modifiez certaines propriétés de l'instance, puis mettez-la à jour. Ici, je récupère entièrement l'objet d'une source différente (il est analysé à partir d'un fichier XML) et interroge pour voir s'il y a déjà une ligne pour ces données. Si c'est le cas, je définis la clé primaire et tente d'exécuter une mise à jour. Quelle est la bonne façon de faire cela?
est ici la version dégrossi du code:
Customer customer = new Customer(); // Customer has a database generated
// identity column called CustomerId
// populate customer object
customer.Name = "Mr. X";
customer.Email = "[email protected]";
// etc.
// is customer already in database?
// identify customer by email
var results = ctx.Where(c => c.Email == customer.Email); // ctx is a DataContext
if (results.Any())
{
Customer existing = results.Single();
// set primary key to match existing one
customer.CustomerId = existing.CustomerId;
// update database
customerTable.Attach(customer); // customerTable is a Table<Customer>
ctx.SubmitChanges();
}
// otherwise do insert
// ...
Intéressant. Je suppose que cela fait ce que j'ai suggéré (mais dans le code). Pouvez-vous expliquer un peu plus comment cela fonctionne pour un débutant de LINQ to SQL? – JasCav
J'ai essayé ça. Cela me donne la même erreur. – MCS
Il me semble aussi que customerTable.Attach (client, existant) devrait fonctionner. Mais si je ne mets pas customer.CustomerId, j'obtiens l'erreur: System.InvalidOperationException: La valeur du membre 'CustomerId' d'un objet de type 'Client' a changé. Un membre définissant l'identité de l'objet ne peut pas être modifié. Et quand je mets Customer.CustomerId je reçois le DuplicateKeyException! Allez comprendre. – MCS