我想詳細闡述斯蒂芬克利裏的答案。他在使用部分類/方法處理EF中的業務規則時是正確的。但是,他沒有詳細說明在該部分類/方法中應該做什麼。我在我的博客上創建了一個URL縮短服務,以此作爲示例。我的ShortURL
實體只有兩列/屬性。 Url
和ID
。
我想驗證縮短的URL是一個有效的URL,然後通過EF實際存儲在數據庫中。所以我創建瞭如下的部分類和方法:
public partial class ShortURL
{
partial void OnUrlChanging(string url)
{
if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"))
throw new Exception("Not a valid URL.");
}
}
這會停止EF更改屬性,使其保留爲NULL。但這就是它所做的一切。它並沒有給我一個簡單的方法來獲取錯誤信息並將其顯示給用戶(我知道編輯:根據http://www.sellsbrothers.com/posts/Details/12700 IDataErrorInfo是獲取錯誤消息在ASP中正確顯示的唯一方法。 NET MVC),所以我遵循了另一個例子,我在網絡的黑暗凹處找到了某個地方,並且讓我的部分類繼承自IDataErrorInfo
。然後我實現了接口幷包含一個專用字典對象來存儲錯誤消息。
public partial class ShortURL : IDataErrorInfo
{
private Dictionary<string, string> errors = new Dictionary<string, string>();
partial void OnUrlChanging(string url)
{
if (!Regex.IsMatch(url, @"(^((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"))
errors.Add("Url", "Not a valid URL.");
}
public string Error
{
get { return string.Empty; } //I never use this so I just return empty.
}
public string this[string columnName]
{
get
{
if (errors.ContainsKey(columnName))
return errors[columnName];
return string.Empty; //Return empty if no error in dictionary.
}
}
}
現在,我有一個全功能的方式來存儲,檢索和顯示錯誤消息。現在回到我的控制器(在MVC中)我能夠做到if (!ModelState.IsValid)
[HttpPost]
public ViewResult URLShortener(ShortURL shortURL)
{
if (!ModelState.IsValid)
return View();
shortURL.Url = shortURL.Url.ToLower().StartsWith("www.") ? "http://" + shortURL.Url : shortURL.Url;
shortURLRepository.AddShortURL(shortURL);
object model = "http://www.u413.com/" + ShortCodes.LongToShortCode(shortURL.UrlID);
//Not related to this answer but I had to cast my string as a generic object because the View() method has a (string, string) constructor that does something totally different. My view actually uses string as the model. I know I know, I could have just used ViewBag.
return View("ShowUrl", model);
}
有你去。一個如何擴展EF的部分方法的工作示例,以及如何將驗證傳播回UI。如果有任何需要改進的地方,或者我錯過了某些東西,請告訴我。
是你的實體框架類還是你的域模型?或者你有單獨的課程? – RPM1984 2011-02-10 00:39:39
您是使用實體對象還是POCO? – 2011-02-10 08:46:44
@Ladislav:我從Visual Studio 2010使用`EF` – Xaqron 2011-02-10 12:30:45