我有一个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
的{{1}}挂钩完成此检查,并在失败时返回应用程序异常。
此外,在正常验证期间,我想检查以确保不会违反规则(在这种情况下为resp.respName ...)
所以,通常我可以做一个... if (action == ChangeAction.Delete) ...
并检查我是否有验证错误。当然,这不知道正在采取什么行动(Changeaction.Delete)
我想我的主要问题是,当try { } catch { var errors = resps.GetRuleViolations() }
被删除时,如何让OnValidate
返回原因而不是崩溃我的整个应用。通常情况下我会抓住Changeaction
,但是如果我将'if语句'放在GetRuleViolations
中......即使在检查期间也是如此,以确定数据是否正确(换句话说,{{ 1}}即使对我不想要的新插入检查也很重要。我只希望在删除时进行那些计数检查)
或者可能更简单地声明:我希望GetRuleViolations
告诉我有人试图删除具有respApprovers.Count()
或GetRuleViolations
的resp,但仅限于respApprovers.Count() > 0
{{1是删除。
答案 0 :(得分:0)
更改GetRuleViolations以接受ChangeAction参数并添加一个无参数版本,该版本使用ChangeAction.None调用它(或根据需要更新或插入)。然后根据需要将支票移到那里。
public IEnumerable<RuleViolation> GetRuleViolations( ChangeAction action )
{
if (action == ChangeAction.Delete) {
...
}
else {
...
}
}
public IEnumerable<RuleViolation> GetRuleViolations()
{
return GetRuleViolations( ChangeAction.None );
}