2

我有一个带有 2 个字段的 sql server 表,ID(主键)和名称(唯一键)。我正在使用 linq to sql 从该表中为 asp.net MVC 生成模型对象。

为了执行模型验证,我在部分类中实现了 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");
}
}

理想情况下,我希望部分类中的 OnNameChanging 方法在尝试添加公司之前执行唯一键检查。

关于我应该如何做到这一点的任何想法?到目前为止,我唯一的想法是在部分类中创建一个新的数据库连接并查询表。

谢谢

4

2 回答 2

2

一种可能性是 AddCompany 方法返回一个指示操作成功或失败的布尔值。

但是,通常在您尝试添加记录之前捕获此类错误。放一个

bool Exists(string companyName) 

方法,并在尝试添加记录之前使用它来捕获错误。

这样做更可取的原因是您确切地知道失败发生的原因。否则,您将不得不捕获自定义异常或检查返回的错误代码。

于 2009-06-10T04:42:53.970 回答
1

无论您如何对其进行切片,您显然都必须访问数据库以获取已在使用的名称列表。因此,我建议在您的存储库中添加一个方法,该方法基本上只返回一个IList<string>IEnumerable<string>只包含数据库中该表中的所有不同名称。然后,在您的验证方法中,只需在存储库上使用该方法来获取所有唯一名称,并在那里实施您的检查。

于 2009-06-10T04:42:06.637 回答