【发布时间】:2012-03-22 07:03:55
【问题描述】:
您将如何设计此场景(使用 Entity Framework 4.1、代码优先和存储库模式): 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 项目中驻留存储库方法(插入、更新等)以及 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 方法如下所示:
public string Commit()
{
string errorMessage = string.Empty;
try
{
Database.Commit();
}
catch (DbUpdateException updExc)
{
errorMessage = updExc.InnerException.Message;
}
return errorMessage;
}
如您所见,我正在处理 Unit of Work 类的 Commit() 方法中的 DbUpdateException;这意味着对于每个可能导致更新错误的类,都将在此处处理。
假设使用以下数据插入用户记录:
(UserId,....,Email,...)
1, ... , person1@mail.com , ...
2, ... , person1@mail.com , ...
很明显,这将导致 DbUpdateException 发生。当然,这可以被捕获并传播到它应该出现的地方。我感觉这个设计是完全错误的:
应分别对每个属性进行验证:字段值的唯一性难道不应该如此吗?这是否意味着我必须将 DAL 和 MODEL 合并到一个项目中?
如何处理因违反表 A 中的字段 A、表 B 中的字段 B、表 C 中的字段C 的唯一性而导致的错误?使用通用错误消息“值已存在”或“违反唯一性”不是很具有描述性!
我是否应该插入另一个负责此类错误处理的项目业务层?
我应该处理更新的 (ASP.NET MVC) Action/Controller 中的错误吗?
如何在多语言应用程序中处理正确的错误消息?
【问题讨论】:
标签: entity-framework exception error-handling repository