你會怎麼設計這個方案來處理實體框架和存儲庫模式DB例外(使用實體框架4.1,代碼第一次和存儲庫模式): 的Visual Studio解決方案包含以下項目凡
Solution
|-Web Application Project
|-DAL Project
|-Model Project
所以在模型項目中有各種類。假設我們在那裏叫用戶,定義如下(精簡)類:
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項目所在的庫方法(插入,更新等),並初始化類:
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;
}
}
}
提交我的工作類股的方法是這樣的:
public string Commit()
{
string errorMessage = string.Empty;
try
{
Database.Commit();
}
catch (DbUpdateException updExc)
{
errorMessage = updExc.InnerException.Message;
}
return errorMessage;
}
正如你看到的,我處理DbUpdateException
在Commit()
方法工作單元班;這意味着每個類可能會導致更新錯誤,這將在這裏處理。
假設一個插入用戶記錄如下數據:
(UserId,....,Email,...)
1, ... , [email protected] , ...
2, ... , [email protected] , ...
,很明顯,這將導致發生DbUpdateException。當然,這可以被捕獲並傳播到它應該出現的地方。我有一種感覺,這樣的設計是完全錯誤的:
驗證應單獨出現每個屬性:不應該這是真的也爲現場的值的唯一性?這是否意味着我必須將DAL和MODEL合併到一個項目中?
我該如何處理由表A中的fieldA,表B中的fieldB,表C中的fieldC違反唯一性引起的錯誤?使用通用錯誤消息「值已存在」或「唯一性違規」不是很具描述性!
我應該插入另一個項目 - 業務層來照顧這種錯誤處理嗎?
我應該在(ASP.NET MVC)操作/控制器中執行更新嗎?
如何在多語言應用程序中處理正確的錯誤消息?