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:
-
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?
-
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!
-
Muss ich das einfügen ein anderes Projekt-der Business-Schicht, die kümmert sich um solche Fehlerbehandlung?
-
Sollte ich mit dem Fehler in der (ASP.NET MVC) - Action/Controller die das update?
-
Zu behandeln, wie eine Fehlermeldung in einer mehrsprachigen Anwendung?
InformationsquelleAutor Savvas Sopiadis | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stehe ich vor der gleichen situation und im moment bin ich der Behandlung der Ausnahme in meinem controller.
Betrachten den folgenden Unternehmen:
Habe ich eine unique-Einschränkung auf das "Number" - Feld in der Datenbank, so dass, wenn ein doppelter Wert eingegeben wird, wird eine Ausnahme geworfen werden. Dies ist, wie ich mich der Behandlung der Ausnahme:
All dies tut, ist die Rückkehr zu der gleichen Ansicht und zeigt eine Validierung Fehlermeldung an den Benutzer ausgegeben, wie diese:
Ich bin mir nicht sicher, wie 'richtige' dies ist, aber ich kann gerade nicht denken, einen besseren Weg, dies zu behandeln (E. G. selbst wenn ich gefangen in meinem
DbContext
abgeleitete Klasse und warf eine weitere Ausnahme würde ich noch behandeln müssen, dass es in der Steuerung, um nichts mit ihm zu Laufzeit).Ich bin mir auch nicht sicher, ob ich brauche, um zu überprüfen, die innere Ausnahme. Ich veränderte den code aus diese post, die im wesentlichen prüft, ob ein
SqlException
im inneren Ausnahmen und überprüft die Fehler-Nummer (in diesem Fall 2627, das ist ein unique key-Einschränkung), bevor die Berichterstattung darüber an den Benutzer. Wenn die SQL-Fehler-Anzahl ist etwas anderes eine generische Fehlermeldung angezeigt.Update:
Ich jetzt behandeln Sie Ausnahmen in einer domain service Klasse, die ein Derivat der Beispiel hier gezeigt, die mir erlaubt, die Ausnahme behandeln, die außerhalb des Controllers.
InformationsquelleAutor Benjamin Gale