2013-08-22 4 views
1

Mon projet MVC utilise la structure d'entité pour gérer la communication avec la base de données.Quelle est la meilleure façon de tester un enregistrement préexistant dans Entity Framework?

L'application Web doit pouvoir vérifier qu'une valeur fournie par l'utilisateur via un formulaire Web n'existe pas dans la base de données avant l'appel de la méthode SaveChanges. Un index sur la table de base de données empêche les valeurs en double. Je ne veux pas me fier à l'exception SQL pour découvrir qu'il y a un problème avec la nouvelle valeur.

Ce que j'ai fait était d'utiliser une instruction Linq qui récupère tous les enregistrements qui ont une propriété ContactKey avec la valeur soumise. Ensuite, j'utilise la propriété Count de l'entité. Si elle renvoie 0, je suppose que la nouvelle valeur est unique. Voici l'extrait de code:

// newKey is the value provided by user 
var existing = from c in db.Contacts where c.ContactKey == newKey select c; 
if (existing.Count()==0) 
{ 
    isUnique = true; 
} 

Bien que cela semble fonctionner comme prévu, je suis nouveau à LINQ et ne suis pas sûr que ce soit la meilleure façon d'aller.

J'apprécierais toute confirmation ou suggestion d'amélioration.

Don Langham

+0

Gardez à l'esprit que vous vous interrogez la base de données, puis de revenir à votre code avant d'insérer, ce qui signifie qu'il est possible (peu probable cependant) qu'entre le moment vous vérifiez et l'heure que vous insérez, cette valeur peut être insérée par un utilisateur Web différent. Si cela vous préoccupe, vous pouvez envisager d'encapsuler le select et de l'insérer dans une transaction, éventuellement dans un proc stocké traditionnel. –

+0

Oui, je suis d'accord que c'est quelque chose que je devrais expliquer. Je ne sais pas comment rendre le Model.SaveChanges appeler une procédure stockée (peut-être une classe qui hérite de n'importe quelle classe de base gère cela?). –

+0

Si c'est Database-first avec EF5, tout le travail est fait pour vous - quand vous construisez votre modèle, il vous permet d'importer des procs directement, et vous pouvez appeler 'db.MyStoredProcName (someParam, nextParam)', et il construit le retour types et tout pour vous. Avec EF4, c'est juste un peu plus de travail, en construisant une Importation de Fonction (toujours dans le concepteur cependant) pour correspondre au proc. Avec le code d'abord, je ne pense pas que ce soit intégré, donc vous devrez exécuter le proc à l'ancienne et mapper les paramètres et retourner les valeurs à la main. –

Répondre

4

Utilisez Enumerable.Any

bool ifExist = db.Contacts.Any(r=> r.ContactKey == newKey); 
+2

boo - est-ce un nouveau type de données;) –

+0

utilisez var ou vous ne l'aimez pas? – speti43

+0

@DarrenDavies, juste corrigé :) – Habib

Questions connexes