針對丹的問題:
首先,看看這裏:http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs
在這個文件生活在我的另一篇文章中展示的整個邏輯。
驗證:保存(期間調用),如果驗證()返回false拋出一個異常。 如果物業ValidateWhenSaving(這是一個恆定的,所以你必須重新編譯亞音速去改變它)是真(默認)
BeforeValidate獲得的唯一叫:保存(期間調用)時ValidateWhenSaving是真實的。默認情況下不做任何事
BeforeInsert:如果記錄是新的,則在Save()期間調用。默認情況下不做任何事
BeforeUpdate:如果記錄是新的,則在Save()期間調用。默認情況下不做任何事
AfterCommit:在成功插入/更新記錄後調用。默認情況下不做任何事
在我的validate()的例子,我首先讓默認ValidatColumnSettings()方法運行,這將增加錯誤,如「最大字符串lenght超出列產品名稱:」如果產品名稱是比定義的值長數據庫。然後,如果ProductName爲空,則添加另一個錯誤字符串,如果總體錯誤數大於零,則返回false。
這將在Save()期間拋出異常,因此您無法將記錄存儲在數據庫中。
我建議你自己調用Validate(),如果它返回false,則在頁面底部顯示this.Errors的元素(簡單方法)或(更優雅)你創建一個Dictionary<string, string>
,其中關鍵是列名和值是原因。
private Dictionary<string, string> CustomErrors = new Dictionary<string, string>
protected override bool Validate()
{
this.CustomErrors.Clear();
ValidateColumnSettings();
if (string.IsNullOrEmpty(this.ProductName))
this.CustomErrors.Add(this.Columns.ProductName, "cannot be empty");
if (this.UnitPrice < 0)
this.CustomErrors.Add(this.Columns.UnitPrice, "has to be 0 or bigger");
return this.CustomErrors.Count == 0 && Errors.Count == 0;
}
然後,如果Validate()返回false,則可以直接在網頁的右側字段之外添加原因。
如果Validate()返回true,則可以安全地調用Save(),但請記住,Save()可能會在持續存在期間拋出其他錯誤,如「Dublicate Key ...」;
我添加了一些更詳細的解釋 – 2010-10-07 11:52:30