【发布时间】:2010-02-02 10:41:34
【问题描述】:
我正在尝试在LINQ to SQL 实体的基类中实现验证框架。我遇到的问题是让 OnValidate 事件正确触发。
原因是 OnValidate 被标记为部分,所以我不能在基类中提供默认实现;它被 LINQ to SQL 类声明的新方法隐藏。
如何解决它,以便自动调用基类中的 OnValidate 事件?
示例代码如下。
public class EntityBase
{
public bool IsValid
{
get { return (GetValidationErrors().Count() == 0); }
}
public virtual IEnumerable<ValidationError> GetValidationErrors()
{
yield break;
}
public void OnValidate(System.Data.Linq.ChangeAction action)
{
//This never gets fired unless I call explicitly in the derived class.
if (!IsValid)
{
StringBuilder sb= new StringBuilder();
sb.AppendLine("Validation errors prevent saving");
foreach (ValidationError error in GetValidationErrors())
{
sb.AppendLine(String.Format("{0}: {1}", error.PropertyName, error.ErrorMessage));
}
throw new ApplicationException(sb.ToString());
}
}
}
public partial class LinqThingy: EntityBase
{
public override IEnumerable<ValidationError> GetValidationErrors()
{
if (String.IsNullOrEmpty(Name)) yield return new ValidationError("Name required", "Name");
}
//Eww nasty, don't want to have to do this.
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
base.OnValidate(action);
}
}
【问题讨论】:
标签: c# linq-to-sql validation inheritance