2009-06-10 7 views
2

ID(プライマリキー)と名前(ユニークキー)の2つのフィールドを持つSQL Serverテーブルがあります。 私はこのテーブルからasp.net MVCのモデルオブジェクトを生成するためにSQLにlinqを使用しています。 Model.IsValidプロパティとHtml.ValidationSummaryヘルパーに期待通りasp.net mvcとlinqからsqlへのユニークキーの検証?

部分クラスに
public partial class Company : IDataErrorInfo 
{ 
    private Dictionary<string, string> _errors = new Dictionary<string,string>(); 

    partial void OnNameChanging(string value) 
    { 
     if (value.Trim().Length == 0) 
     { 
      _errors.Add("Name", "Name is required"); 
      return; 
     } 
    } 
} 

を私はIDateErrorInfoを実施してきたモデルの検証を行うためにこれが実行されます。

ただし、このコードでは、新しく作成された会社名が空白でないことを確認するだけです。また、名前が他の会社のテーブルで使用されているかどうかを確認する必要があります。

私のリポジトリでAddCompanyメソッドを呼び出してSQLExceptionをキャッチするだけですが、これは汚いと感じます。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude="ID")] Company companyToCreate) 
{ 
if (!ModelState.IsValid) 
{ 
    return View(); 
} 
//Add to the Database 
try 
{ 
    _companyRepos.AddCompany(companyToCreate); 
    return RedirectToAction("Index"); 
} 
catch(SQLException ex) 
{ 
    return View("do something to show the error inserting"); 
} 
} 

理想的には私は私が会社を追加しようとする前に、部分クラスでOnNameChangingメソッドが一意のキーチェックを実行します。

どのように私はこれを行う必要があります上の任意のアイデア?私がこれまでに持っている唯一の考えは、部分クラスに新しいデータベース接続を作成してテーブルを照会することです。あなたがそれをスライスしかし

おかげで

答えて

1

、あなたは明らかに、すでに使用中の名前のリストを取得するためにデータベースをヒットする必要があるとしています。したがって、基本的には、IListまたはIEnumberaleを返すメソッドをリポジトリに追加することをお勧めします。次に、検証メソッドでは、リポジトリでそのメソッドを使用してすべての一意の名前を取得し、そこにチェックを実装します。

+0

うん、それは動作し、reasobably清潔です。 – Cephas

+0

誰がその新しいリポジトリメソッドを消費する予定ですか?コントローラ?今あなたのコントローラはビ​​ジネスロジックを持っています(そして今はトランザクションスクリプトではありませんか?)これをビジネス/ドメイン層/モデルに組み込むための方法はありますか? – Merritt

2

1つの可能性は、AddCompanyメソッドが操作の成功または失敗を示すブール値を返すことです。

ただし、レコードを追加しようとする前に、このタイプのエラーをキャッチすることが慣例です。あなたの会社のリポジトリに

bool Exists(string companyName) 

方法を入れて、レコードを追加しようとする前にエラーをキャッチするためにこれを使用しています。

これが望ましい理由は、障害が発生した理由を正確に知っているからです。それ以外の場合は、カスタム例外をキャッチするか、返されたエラーコードを調べる必要があります。