Частичный класс LINQ to SQL OnValidate Changeaction.Delete - PullRequest
0 голосов
/ 06 апреля 2009

У меня есть частичный класс 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)

Полагаю, мой главный вопрос: как я могу OnValidate вернуть причину, а не вывести из строя все мое приложение, когда Changeaction удаляется. Обычно я ловил бы GetRuleViolations, но если я вставлю 'if if' в GetRuleViolations ..., это будет всегда верно даже во время проверок, чтобы видеть, были ли данные правильными (другими словами, respApprovers.Count() будет иметь значение даже для проверок новых вставок, которые я не хочу. Я только хочу, чтобы эти проверки были выполнены при удалении)

Или, возможно, проще говоря: я хочу, чтобы GetRuleViolations сообщал мне, когда кто-то пытается удалить респ, у которого respApprovers.Count() > 0 или approvals.Count() > 0, но только когда OnValidate Changeaction удаляется.

1 Ответ

0 голосов
/ 06 апреля 2009

Измените GetRuleViolations, чтобы принять параметр ChangeAction, и добавьте версию без параметров, которая вызывает его с помощью ChangeAction.None (или Update или Insert, в зависимости от ситуации). Затем переместите чек туда, куда хотите.

public IEnumerable<RuleViolation> GetRuleViolations( ChangeAction action )
{
    if (action == ChangeAction.Delete) {
       ...
    }
    else {
       ...
    }
}

public IEnumerable<RuleViolation> GetRuleViolations()
{
    return GetRuleViolations( ChangeAction.None );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...