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