2014-01-29 36 views
0

我想问你什么是最好的方式来获得这项工作。使用唯一约束条件的实体框架更新查询

我有一个独特的领域的表。

public partial class DeviceInstance 
{ 
    public int Id { get; set; } 
    [Required] 
    public int DeviceId { get; set; } 
    [Required] 
    [MaxLength(50)] 
    public string SerialNo { get; set; } <--- This field is unique 
    [Required] 
    public System.DateTime CreationDate { get; set; } 
} 

,我有检查简单的方法,如果是的SerialNo独特:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include="Id,DeviceId,SerialNo,CreationDate")] DeviceInstance deviceinstance) 
    { 
     if (ModelState.IsValid) 
     { 
      if(IsUnique(deviceinstance.SerialNo)) 
      { 
       db.Entry(deviceinstance).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Numer seryjny nie jest unikalny"); 
      } 
     } 
     ViewBag.DeviceId = new SelectList(db.Devices, "Id", "Name", deviceinstance.DeviceId); 
     ViewBag.Id = new SelectList(db.DeviceUsages, "DeviceInstanceId", "DeviceInstanceId", deviceinstance.Id); 
     return View(deviceinstance); 
    } 

现在我不能更新任何:

public bool IsUnique(String value) 
    { 
     if (!String.IsNullOrEmpty(value)) 
     { 
      var No = value.ToString(); 
      var a = db.DeviceInstances.Where(model => model.SerialNo == No).FirstOrDefault(); 
      if (a == null) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

而且enity框架方法表编辑记录因为isUnique始终返回serialNo已经存在的记录。什么是真实的。

现在我的问题。它更好地修改isUnique方法或 删除isUnique方法,并添加捕获的dbUpdateException尝试添加重复时引发?

回答

2

如果您要对数据库实施约束,则会更加一致。

在实体框架的一面,你可以捕捉异常如下:

try 
{ 
    using (var context = new YourEntityContext()) 
    { 
     context.DeviceInstance.Add(new DeviceInstance() { /*Properties*/ }); 
     context.SaveChanges(); 
    } 
} 
catch (DbUpdateException ex) 
{ 
    var sqlexception = ex.InnerException.InnerException as SqlException; 
    if (sqlexception != null) 
    { 
     if (sqlexception.Errors.OfType<SqlError>().Any(se => se.Number == 2601)) 
     { 
      // Duplicate Key Exception 
     } 
     else 
     { 
      // Sth Else 
      throw; 
     } 
    } 
} 

您可以在文档中找到SQLEXCEPTION编号:http://msdn.microsoft.com/en-us/library/cc645603.aspx

+0

是的,我对数据库约束,这就是为什么我能赶上DbUpdateException。顺便说一句,你忘了从xx aspx – szpic

+0

谢谢@szpic,我已经修复它。 –