2

ID(主キー)と名前(一意のキー)の2つのフィールドを持つSQLサーバーテーブルがあります。このテーブルから asp.net MVC のモデル オブジェクトを生成するために、linq to sql を使用しています。

モデルの検証を実行するために、部分クラスに IDateErrorInfo を実装しました

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;
        }
    }
}

これは、Model.IsValid プロパティと Html.ValidationSummary ヘルパーで期待どおりに機能します。

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

リポジトリで 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");
}
}

Company を追加する前に、部分クラスの OnNameChanging メソッドで一意のキー チェックを実行するのが理想的です。

これをどのように行うべきかについてのアイデアはありますか?これまでに考えたことは、部分クラスで新しいデータベース接続を作成し、テーブルにクエリを実行することだけです。

ありがとう

4

2 に答える 2

2

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

ただし、レコードを追加しようとする前に、このタイプのエラーをキャッチするのが通例です。置く

bool Exists(string companyName) 

メソッドを会社のリポジトリに追加し、レコードを追加する前にこれを使用してエラーをキャッチします。

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

于 2009-06-10T04:42:53.970 に答える
1

どのようにスライスしても、すでに使用されている名前のリストを取得するには、明らかにデータベースにアクセスする必要があります。したがって、基本的に単に返すIList<string>IEnumerable<string>、DB のそのテーブルにあるすべての個別の名前を含むメソッドをリポジトリに追加することをお勧めします。次に、検証メソッドで、リポジトリでそのメソッドを使用してすべての一意の名前を取得し、そこにチェックを実装します。

于 2009-06-10T04:42:06.637 に答える