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:

  1. 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?
  2. 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!
  3. Dois-je insérer un autre projet-de la couche de gestion qui prend soin d'une telle erreur de manipulation?
  4. Dois-je traiter les erreurs dans le (ASP.NET MVC) d'Action/Contrôleur qui effectue la mise à jour?
  5. La manière de traiter un message d'erreur approprié dans un langage multi application?

OriginalL'auteur Savvas Sopiadis | 2012-03-22