【发布时间】:2009-04-06 17:10:33
【问题描述】:
我有一个 LINQ 部分类:
public partial class resp
{
public IEnumerable<RuleViolation> GetRuleViolations()
{
if (String.IsNullOrEmpty(respName))
yield return new RuleViolation("Responsibility name required", "respName");
yield break;
}
public bool IsValid
{
// Quick method for checking to see whether an object contains any RuleViolations
get { return (GetRuleViolations().Count() == 0); }
}
partial void OnValidate(ChangeAction action)
{
// Hook to LINQ to be notified before db is actually persisted .. and check to make sure resp is not used by respApprover or approvals
if (action == ChangeAction.Delete && ((respApprovers.Count() != 0 || approvals.Count() != 0)))
throw new ApplicationException("You cannot delete a responsibility that is in use");
if (!IsValid)
throw new ApplicationException("Rule violations prevent saving");
}
}
在我的代码中,我希望能够在删除之前检查责任 (dbo.resp) 是否存在。
我正在使用OnValidate 的钩子完成此检查,如上面的... if (action == ChangeAction.Delete) ... 并在失败时返回应用程序异常。
另外,在正常验证期间,我想检查以确保没有违反规则(在这种情况下为 resp.respName ...)
所以,通常我可以做一个try { } catch { var errors = resps.GetRuleViolations() } 并检查我是否有验证错误。当然,这并不知道正在采取什么行动(Changeaction.Delete)
我想我的主要问题是,当Changeaction 被删除时,我怎样才能让OnValidate 返回一个原因而不是让我的整个应用程序崩溃。通常我会抓住GetRuleViolations,但如果我将“if 语句”放在GetRuleViolations 中......即使在检查数据是否正确时它也总是正确的(换句话说,respApprovers.Count() 甚至很重要用于检查我不想要的新插入。我只希望在删除时进行计数检查)
或者可能更简单地说:我希望GetRuleViolations 告诉我何时有人试图删除具有respApprovers.Count() > 0 或approvals.Count() > 0 的响应,但仅当OnValidate Changeaction 被删除时。
【问题讨论】:
-
这看起来像 LINQ to SQL,如果正确,请这样命名和标记(否则可能会得到其他 LINQ 提供者的答案)。
标签: asp.net .net validation linq-to-sql