2011-03-06 3 views
3

J'ai un projet d'animal de compagnie rédigé en php. L'un des travaux de mon code consiste à charger des fichiers csv et à les écrire dans une table MySQL qui possède à la fois une clé primaire générée automatiquement et une clé unique multipart. Je n'ai aucun contrôle et des moyens de vérifier est un fichier déjà traité si clé unique est venu à portée de main. J'insère des données dans la table avec INSERT IGNORE qui échoue silencieusement quand j'essaye d'insérer des données qui existent déjà et tout fonctionne très bien comme il le devrait.ObjectContext.SaveChanges et Duplicate PRIMARY Key

Maintenant, je suis en train de faire projet similaire en C# 4 LINQ aux entités mais quand je tente d'appeler ObjectContext.SaveChanges() méthode pour les objets à partir de fichiers qui sont déjà dans le tableau, est UpdateException avec SqlClient.SqlException comme jeté exception interne. Une solution a été l'ajout Ignore Duplicate Keys = Yes à l'index et il fonctionne un peu, mais

  • Il est le changement sur le serveur à la place sur le client
  • OptimisticConcurrencyException est jeté sur la mise à jour avec l'index existant

Y at-il moyen facile et élégant accomplir ces insertions avec L2E qui n'implique pas de changements de base de données ???

+0

Je recommande que avant d'enregistrer les modifications pour vérifier l'unicité du champ clé. – RBZ

Répondre

1

Une autre solution sera quelque chose comme ceci:

public void SaveAll(IEnumerable<Entity> entities) 
{ 
    var ids = entities.Select(x => x.Id).ToList(); 
    var idsToRemove = context.Entities.Where(x => ids.Contains(x.Id)).Select(x => x.Id).ToList(); 
    var entitiesToInsert = entities.Where(x => !idsToRemove.Contains(x.Id)); 

    foreach(var entity in entitiesToInsert) 
     context.Entities.AddObject(entity); 
} 
Questions connexes