2009-06-10 43 views
2

我有一个SQL服务器表有2个字段,ID(主键)和名称(唯一键)。 我正在使用linq to sql来从此表中为asp.net MVC生成模型对象。使用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; 
     } 
    } 
} 

为与Model.IsValid财产和Html.ValidationSummary帮手预计这将执行执行我实现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

是的,这工作,并可重新清洁。 – Cephas 2009-06-10 05:31:43

2

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

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

bool Exists(string companyName) 

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

这是最好的原因是你确切地知道为什么失败发生。否则,您将不得不捕获自定义异常或检查返回的错误代码。