2010-10-12 7 views
4

J'ai une application distribuée qui envoie des données via WCF à un serveur à stocker dans la base de données (SQL Server 2008).Linq-to-SQL peut-il effectuer une insertion ou une mise à jour si nécessaire?

Habituellement, ces données sont nouvelles. Donc je fais juste InsertAllOnSubmit().

Mais occasionnellement, en raison de bizarreries de communication avec les périphériques portables qui s'exécutent côté client, je reçois un objet qui est déjà dans le serveur.

Y a-t-il un moyen de dire InsertOrUpdateAllOnSubmit? Ou vais-je devoir changer mon code pour parcourir chaque objet et vérifier si c'est dans la base de données, puis le faire et l'insérer ou le mettre à jour si nécessaire? J'ai tout à fait quelques types d'objets, ce qui va devenir fastidieux très vite :(

+1

Comment définissez-vous "duplicate"? La même clé primaire? Utilisez-vous des colonnes d'identité pour les PK? – AaronLS

+0

@AaronLS - duplicate a la même clé primaire (bien que j'obtienne occasionnellement la violation de contrainte Unique). Comme mes données proviennent de beaucoup de périphériques, les PK sont généralement des GUID. – Vaccano

+0

Donc, vous ne voulez probablement pas un InsertOrUpdate, comme vous ne voudriez pas faire une mise à jour sur un enregistrement existant s'il y a une collision de GUID? C'est à dire. Je suppose que deux périphériques tentent d'insérer des données totalement différentes, mais qu'ils génèrent le même GUID. Par conséquent, plutôt que d'effectuer une mise à jour pour le second enregistrement, vous devez régénérer le GUID, puis insérer les deux enregistrements dans le fichier. base de données avec PK uniques. Peut-être que votre scénario est différent de ce que j'imagine mais c'est ce que je pense. – AaronLS

Répondre

2

Modifier la procédure de sauvegarde sur la base de données pour gérer Insérer des doublons.

+1

Je n'ai pas de procédures stockées sauvegardant ces données. Il utilise simplement Linq-to-SQL pour faire les insertions de données. – Vaccano

+1

Vous pouvez joindre une procédure de magasin pour effectuer vos insertions/mises à jour dans Linq-To-SQL. Vous pouvez écrire une seule procédure pour insérer et mettre à jour. Cela pourrait être plus efficace pour gérer les doublons plutôt qu'en C#. – Viv

+0

Notez également que si vous le faites via une procédure stockée, vous pouvez utiliser la nouvelle syntaxe MERGE pour effectuer l'insertion et la mise à jour en une seule fois. Je pense que cela a été ajouté dans MS SQL 2008 – AaronLS

2

Habituellement ce que j'ai vu comme modèle pour le scénario Lorsque vous tentez d'effectuer une insertion ou une mise à jour et qu'il y a un conflit, comme des objets déjà existants, une fois que vous avez détecté un conflit, vous demandez les nouvelles données et vous appliquez les mises à jour. ou en invitant l'utilisateur à les laisser visualiser les nouvelles données et à décider si leurs données doivent être gagnantes.Cela dépend du contexte et des règles métier

Ceci s'applique principalement à upda mais peut-être que si vous pensez à la raison pour laquelle ces conflits se produisent pour les insertions, vous serez peut-être en mesure d'adapter votre implémentation pour utiliser les techniques de détection et de résolution des accès concurrents. http://msdn.microsoft.com/en-us/library/bb399373.aspx

Questions connexes