как бы вы спроектировали этот сценарий (используя Entity Framework 4.1, Code First и шаблон репозитория): решение Visual Studio содержит следующие проекты
Solution
|-Web Application Project
|-DAL Project
|-Model Project
Таким образом, в модельном проекте есть различные классы.Предположим, у нас есть класс с именем User со следующим определением (урезанным):
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; }
....
}
В проекте DAL находятся методы репозитория (Insert, Update и т. Д.), А также класс Initializer:
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;
}
}
}
Метод Commit моего класса Unit of Work выглядит следующим образом:
public string Commit()
{
string errorMessage = string.Empty;
try
{
Database.Commit();
}
catch (DbUpdateException updExc)
{
errorMessage = updExc.InnerException.Message;
}
return errorMessage;
}
Как вы видите, я обрабатываю DbUpdateException
в методе Commit()
в Unit of Workучебный класс;это означает, что для каждого класса, который может вызвать ошибку обновления, это будет обработано здесь.
Предположим, кто-то вставляет записи пользователя со следующими данными:
(UserId,....,Email,...)
1, ... , person1@mail.com , ...
2, ... , person1@mail.com , ...
Очевидно, что этовызовет исключение DbUpdateException.Конечно, это можно поймать и распространить в том месте, где оно должно появиться.У меня такое ощущение, что этот дизайн совершенно неправильный:
Проверка должна выполняться для каждого свойства в отдельности: не должно ли это быть верно и для уникальности значений поля?Означает ли это, что мне нужно объединить DAL и MODEL в один проект?
Как бы я обрабатывал ошибки, вызванные нарушением уникальности для поля A в таблице A, поля B в таблице B,поле C в таблице C?Использование общего сообщения об ошибке «Значение уже существует» или «Нарушение уникальности» не очень наглядно!
Должен ли я вставить еще один уровень Project-Business, который заботится о такой обработке ошибок?
Должен ли я обрабатывать ошибки в (ASP.NET MVC) Action / Controller, который выполняет обновление?
Как обработать правильную ошибкусообщение в многоязычном приложении?