LINQ

2009-04-06 8 views
0

私はLINQ部分クラスを持っている:私のコードでは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と同じようにに設定し、失敗した場合はアプリケーション例外を返します。また

、通常の検証中に、私は必ずルール違反が行われていないことを確認したい(この場合はresp.respNameを...)

ので、通常私はちょうどtry { } catch { var errors = resps.GetRuleViolations() }と確認を行うことができます検証エラーがあるかどうか。もちろん、取られているもののアクションを知りません(Changeaction.Delete)

私は私の主な質問は、私はその理由を返すのではなくChangeactionが削除されたときに私の全体のアプリケーションをクラッシュさOnValidate持つことができるか、だと思います。通常、私はGetRuleViolationsをキャッチしますが、私が 'if statement'をGetRuleViolationsに入れれば、データが正しいかどうかをチェックする際にも常に真です(言い換えれば、respApprovers.Count()は新しい挿入のチェックでも問題になります)。 I私はのみカウントチェックが削除時に行うことにしたいしたくない)

あるいはおそらくもっと単純に次のように述べています。私は誰かがrespApprovers.Count() > 0またはapprovals.Count() > 0を持ってRESPを削除しようとしたときGetRuleViolationsが私に伝えたいだけOnValidateChangeactionが削除されます。

+0

これはLINQ to SQLのように見えますが、正しい場合はタイトルとタグを付けてください(他のLINQプロバイダの回答が得られるかもしれません)。 – Richard

+0

固定。とても有難い。 –

答えて

0

ChangeActionパラメータを受け入れ、ChangeAction.None(または必要に応じてUpdateまたはInsert)を使用して呼び出すパラメータなしのバージョンを追加するように、GetRuleViolationsを変更します。それからあなたのチェックをあなたが望むように動かしてください。

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

public IEnumerable<RuleViolation> GetRuleViolations() 
{ 
    return GetRuleViolations(ChangeAction.None); 
} 
+0

ああ、完璧!どうもありがとう! –