2009-06-10 5 views
2

J'ai une table de serveur sql avec 2 champs, ID (clé primaire) et nom (clé unique). J'utilise linq to sql pour produire des objets de modèle pour asp.net MVC à partir de cette table.Validez les clés uniques avec asp.net mvc et linq to sql?

Pour effectuer la validation du modèle que j'ai mis IDateErrorInfo dans une classe partielle

public partial class Company : IDataErrorInfo 
{ 
    private Dictionary<string, string> _errors = new Dictionary<string,string>(); 

    partial void OnNameChanging(string value) 
    { 
     if (value.Trim().Length == 0) 
     { 
      _errors.Add("Name", "Name is required"); 
      return; 
     } 
    } 
} 

Ce fonctionne comme prévu avec la propriété Model.IsValid et aide Html.ValidationSummary.

Cependant, ce code vérifie simplement que la société nouvellement créée a un nom qui n'est pas vide. J'ai également besoin de vérifier si le nom a été utilisé par une autre société dans la table.

Je pourrais simplement appeler la méthode AddCompany sur mon dépôt et attraper le SQLException, mais cela semble sale.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude="ID")] Company companyToCreate) 
{ 
if (!ModelState.IsValid) 
{ 
    return View(); 
} 
//Add to the Database 
try 
{ 
    _companyRepos.AddCompany(companyToCreate); 
    return RedirectToAction("Index"); 
} 
catch(SQLException ex) 
{ 
    return View("do something to show the error inserting"); 
} 
} 

Idéalement je veux la méthode OnNameChanging dans la classe partielle pour effectuer le contrôle clé unique avant d'essayer d'ajouter la Société.

Des idées sur comment je devrais faire cela? La seule pensée que j'ai jusqu'à présent est de créer une nouvelle connexion de base de données dans la classe partielle et d'interroger la table.

Merci

Répondre

1

Cependant, vous coupez, vous allez évidemment de frapper la base de données pour obtenir une liste des noms déjà utilisés. Par conséquent, je suggère d'ajouter une méthode dans votre référentiel qui retourne simplement un IList ou IEnumberale qui contient simplement tous les noms distincts dans cette table dans la base de données. Ensuite, dans votre méthode de validation, utilisez simplement cette méthode sur le référentiel pour obtenir tous les noms uniques et implémentez votre vérification à cet endroit.

+0

Oui, cela fonctionne et est reasobably propre. – Cephas

+0

Alors, qui va consommer cette nouvelle méthode de repo? Le controlle? Maintenant, votre contrôleur a une logique métier (et n'est-ce pas maintenant un script de transaction?) Y a-t-il un moyen d'incorporer cela dans la couche/le modèle métier/domaine? – Merritt

2

Il est possible que la méthode AddCompany renvoie un booléen indiquant le succès ou l'échec de l'opération.

Toutefois, il est habituel de détecter ce type d'erreur avant d'essayer d'ajouter l'enregistrement. Mettez une

bool Exists(string companyName) 

méthode dans votre référentiel d'entreprise et utilisez-la pour intercepter l'erreur avant d'essayer d'ajouter l'enregistrement.

La raison pour laquelle cela est préférable est que vous savez exactement pourquoi la panne s'est produite. Sinon, vous devrez soit attraper une exception personnalisée, soit examiner un code d'erreur renvoyé.