回答丹的问题:
首先,看看这里:http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs
在这个文件中包含了我在另一篇文章中展示的全部逻辑。
Validate:在 Save() 期间调用,如果 Validate() 返回 false,则会引发异常。
仅当 Property ValidateWhenSaving(这是一个常量,因此您必须重新编译 SubSonic 才能更改它)为 true(默认)时才调用 Get。
BeforeValidate:当 ValidateWhenSaving 为真时在 Save() 期间调用。默认什么都不做
BeforeInsert:如果记录是新的,则在 Save() 期间调用。默认情况下什么都不做。
BeforeUpdate:如果记录是新的,则在 Save() 期间调用。默认情况下什么都不做。
AfterCommit:在成功插入/更新记录后调用。默认情况下什么都不做。
在我的 Validate() 示例中,我首先让默认的 ValidatColumnSettings() 方法运行,如果产品名称长于数据库中定义的值,它将添加诸如“列 ProductName 的最大字符串长度超出”之类的错误。然后,如果 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() 可能会在持久性期间引发其他错误,例如“复制键 ...”;