LINQ to SQL分部类OnValidate Changeaction.Delete

时间:2009-04-06 17:10:34

标签: asp.net .net validation linq-to-sql

我有一个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是删除。

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 );
}