Wo zu behandeln, DB-Ausnahmen in Entity Framework und repository pattern

wie würden Sie Gestaltung in diesem Szenario (mit Entity Framework 4.1 Code First-und repository-pattern):
die Visual Studio-Projektmappe enthält die folgenden Projekte

Solution
|-Web Application Project
|-DAL Project
|-Model Project

So in das Modell-Projekt gibt es verschiedene Klassen. Nehmen wir an, wir haben eine Klasse namens " User mit der folgenden definition (abgespeckte):

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; }

    ....
}

In der DAL-Projekt befinden sich die repository-Methoden (Insert, Update usw.) und auch die Initialisierung der Klasse:

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;
        }
    }
}

Die Commit-Methode von meiner Arbeitseinheit, die Klasse sieht wie folgt aus:

public string Commit()
{
    string errorMessage = string.Empty;

    try
    {
        Database.Commit();
    }
    catch (DbUpdateException updExc)
    {                                 
        errorMessage = updExc.InnerException.Message;            
    }                       

    return errorMessage;
}

Wie Sie sehen, bin ich Umgang mit DbUpdateException im Commit() Methode von der Unit of Work. Klasse; das bedeutet für jede Klasse, die kann bewirken, dass ein update-Fehler, das wäre hier behandelt.

Angenommen, man fügt die Benutzer-Datensätze mit den folgenden Daten:

(UserId,....,Email,...)
1, ... , person1@mail.com , ...
2, ... , person1@mail.com , ...

Es 's offensichtlich, dass dies die Ursache für DbUpdateException auftreten. Natürlich kann man gefangen und an den Ort, wo es erscheinen sollte. Ich habe das Gefühl, dass dieses design ist völlig falsch:

  1. Validierung auftreten sollten für jede Eigenschaft separat: sollte dies nicht auch für die Einzigartigkeit der Werte des Feldes? Bedeutet das, dass ich zur Zusammenführung von DAL und das MODELL in einem Projekt?

  2. Wie würde ich damit umgehen, Fehler, verursacht durch eine Verletzung der Eindeutigkeit für fieldA in der Tabelle Ein, fieldB in Tabelle B, fieldC in Tabelle C? Mit einer generischen Fehlermeldung "Der Wert ist bereits vorhanden" oder "Einzigartigkeit Verletzung" ist nicht sehr aussagekräftig!

  3. Muss ich das einfügen ein anderes Projekt-der Business-Schicht, die kümmert sich um solche Fehlerbehandlung?

  4. Sollte ich mit dem Fehler in der (ASP.NET MVC) - Action/Controller die das update?

  5. Zu behandeln, wie eine Fehlermeldung in einer mehrsprachigen Anwendung?

InformationsquelleAutor Savvas Sopiadis | 2012-03-22

Schreibe einen Kommentar