Où poignée DB exceptions dans l'Entity Framework et le modèle de référentiel
comment feriez-vous la conception de ce scénario (à l'aide de Entity Framework 4.1, le Premier Code et modèle de référentiel):
la solution Visual Studio contient les projets suivants
Solution
|-Web Application Project
|-DAL Project
|-Model Project
Ainsi, dans le Modèle de Projet, il y a différentes classes. Supposons que nous avons là une classe appelée Utilisateur avec la définition suivante (dépouillé):
public class User{
[Key]
public int UserId { get; set; }
....
//this property has a unique constraint created in a custom DB Initializer class
public string email { get; set; }
....
}
Dans la DAL Projet réside le référentiel de méthodes (Insert, Update, etc.) et aussi l'Initialiseur de classe:
public class MyDatabaseInitializer : IDatabaseInitializer<MyDatabase>
{
public void InitializeDatabase(MyDatabase context)
{
try
{
if (!context.Database.Exists())
{
context.Database.Create();
context.Database.ExecuteSqlCommand(
"ALTER TABLE Users ADD CONSTRAINT uc_Email UNIQUE(Email)");
}
}
catch (Exception ex)
{
throw ex.InnerException;
}
}
}
La méthode de validation de mon Unité de Travail de la classe ressemble à ceci:
public string Commit()
{
string errorMessage = string.Empty;
try
{
Database.Commit();
}
catch (DbUpdateException updExc)
{
errorMessage = updExc.InnerException.Message;
}
return errorMessage;
}
Comme vous le voyez je suis la manipulation DbUpdateException
dans le Commit()
méthode de l'Unité de Travail de la classe; cela signifie que pour chaque classe, ce qui pourrait entraîner une erreur de mise à jour, ce serait traitée ici.
Supposons que l'on insère, l'Utilisateur enregistre les Données suivantes:
(UserId,....,Email,...)
1, ... , person1@mail.com , ...
2, ... , person1@mail.com , ...
Il est évident que cela va provoquer un DbUpdateException à se produire. Bien sûr, cela peut être pris et propagées à l'endroit où il devrait s'afficher. J'ai le sentiment que cette conception est complètement faux:
- La Validation devrait se produire pour chaque propriété séparément: ne devrait-ce pas être vrai aussi pour l'unicité des valeurs de champ? Est-ce à dire que je dois fusionner DAL et le MODÈLE dans un projet?
- Comment gérer les erreurs causés par une violation de l'unicité de fieldA dans le tableau A, fieldB dans le tableau B, fieldC dans le tableau C? À l'aide d'un message d'erreur générique "La valeur existe déjà" ou "violation d'Unicité" n'est pas très descriptif!
- Dois-je insérer un autre projet-de la couche de gestion qui prend soin d'une telle erreur de manipulation?
- Dois-je traiter les erreurs dans le (ASP.NET MVC) d'Action/Contrôleur qui effectue la mise à jour?
- La manière de traiter un message d'erreur approprié dans un langage multi application?
OriginalL'auteur Savvas Sopiadis | 2012-03-22
Vous devez vous connecter pour publier un commentaire.
Je suis confronté à la même situation et au moment où je suis de la manipulation de l'exception dans mon contrôleur.
Considérer l'entité suivante:
J'ai une contrainte unique mis en place sur le 'Nombre' de champ dans la base de données de sorte que si un double de la valeur est saisie d'une exception sera levée. C'est ainsi que je suis de la manipulation de l'exception:
De tout cela est de retour pour le même point de vue et l'affichage d'une erreur de validation à l'utilisateur comme ceci:
Je ne suis pas sûr de savoir comment " bon " c'est mais je ne peux pas actuellement de penser à une meilleure façon de gérer cela (E. G. même si je l'ai pris dans mes
DbContext
de la classe dérivée et jeta un plus spécifiques exception j'aurais encore besoin de le gérer dans le contrôleur afin de faire quelque chose avec elle au moment de l'exécution).Je ne suis pas sûr si j'ai besoin de vérifier l'exception interne. J'ai modifié le code de cette post qui en gros chèques pour un
SqlException
à l'intérieur des exceptions et vérifie le numéro de l'erreur (dans ce cas, 2627 qui est une contrainte de clé unique) avant de les signaler à l'utilisateur. Si l'erreur SQL nombre est autre chose, un message d'erreur générique est affiché à la place.Mise à jour:
J'ai maintenant de gérer les exceptions dans une classe de service de domaine qui est un dérivé de la l'exemple montré ici qui me permet de gérer l'exception à l'extérieur du contrôleur.
OriginalL'auteur Benjamin Gale