【问题标题】:LINQ to SQL partial class OnValidate Changeaction.DeleteLINQ to SQL 部分类 OnValidate Changeaction.Delete
【发布时间】: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() &gt; 0 或approvals.Count() &gt; 0 的响应,但仅当OnValidate Changeaction 被删除时。

【问题讨论】:

  • 这看起来像 LINQ to SQL,如果正确,请这样命名和标记(否则可能会得到其他 LINQ 提供者的答案)。

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


【解决方案1】:

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

【讨论】:

  • 啊,完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
相关资源
最近更新 更多