2009-06-10 104 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) 

方法,並在嘗試添加記錄之前使用它來捕獲錯誤。

這是最好的原因是你確切地知道爲什麼失敗發生。否則,您將不得不捕獲自定義異常或檢查返回的錯誤代碼。