2017-01-08 3 views
1

J'ai un utilisateur de classe qui a un attribut Nom qui doit être unique. Jusqu'à présent, j'ai fait enquête sur 3 façons de vérifier ceci:Meilleur moyen de contrôler l'unicité d'un attribut en utilisant le code EF Premier

  • Annotations

    [StringLength(100)] 
    [Index(IsUnique = true)] 
    public string Name { get; set; } 
    

Le problème est, en tentant d'insérer un utilisateur avec un nom répété jette cette ex: DbUpdateException comme je peux le voir, je devrais naviguer dans les exceptions internes (que je ne sais pas si c'est possible, mais je suppose que c'est le cas) et le dernier message d'exception interne n'est pas convivial du tout.

  • Api Courant

https://stackoverflow.com/a/23155759/5750078

Je havent essayé, mais je crois qu'il est a le même problème que les annotations.

  • Vérifier la main

code du contrôleur:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Name,Password,Profile")] User user) 
    { 
     if (ModelState.IsValid) 
     { 
      lock (locker) 
      { 
       validateNameUnicity(); 
       db.Users.Add(user); 
       db.SaveChanges(); 
      } 
      return RedirectToAction("Index"); 
     } 

     return View(user); 
    } 

Problème: le contrôle dépend de mon code, qui peut ne pas être aussi précis que checkings de base date. En outre, je vais devoir programmer plus de logique que les deux autres options. Et enfin, mais si j'accède à la base de données directement, il n'y aura pas de contrôle du tout.

J'ai besoin de savoir quelle est la meilleure pratique pour le faire, parce que j'essaie d'apprendre par moi-même, et j'aimerais faire les choses le mieux possible.

Répondre

4

Vous devriez faire les deux, un code d'entrée et un un index d'unicité comme garde finale lorsque des utilisateurs simultanés parviennent à insérer des enregistrements identiques après tout. (En raison de la latence entre la vérification et l'insertion réelle). Cela signifie que vous devez toujours attraper des exceptions lorsque vous appelez le SaveChanges, mais ce n'est pas une mauvaise idée de toute façon.

Pour la vérification de l'unicité, vous pouvez utiliser le mécanisme que j'ai décrit here, il suffit de changer email en Name et vous êtes prêt à partir.

Vous pouvez déterrer le dernier message d'exception d'une chaîne d'exceptions internes par cette méthode d'extension:

public static string GetDeepestExceptionMessage(this Exception exception) 
{ 
    string msg = string.Empty; 
    while (exception != null) 
    { 
     msg = exception.Message; 
     exception = exception.InnerException; 
    } 
    return msg; 
}