关于Entity Framework 4.0/4.1数据验证的一点体会

最近用Entity Framework 4.1做一个MVC3的网站应用的数据层,遇到一个问题,在修改或添加实体属性的验证后,对数据库中已经存在的数据编辑会有影响,即使当前的编辑操作没有涉及到修改验证规则的项,在SaveChanges()也会抛出异常。

比如说,有如下类定义:

 public class User

{
    
public int UserId { getset; }
    
public string LogOnName { getset; }
    
public System.DateTime LastLogOnTime { getset; }

相应的验证定义:

[MetadataType(typeof(UserMetaData))]
public partial class User
{
}

public class UserMetaData
{
    [Display(Name 
= "User Id")]
    
public object UserId { getset; }

    [StringLength(
50)]
    [Display(Name 
= "Log On Name")]
    [RegularExpressionAttribute(
"^[a-zA-Z][a-zA-Z0-9_]{4,}$", ErrorMessage = "Please enter a valid Log On Name.")]
    [DisplayFormat(ConvertEmptyStringToNull 
= false)]
    
public object LogOnName { getset; }

    [Display(Name 
= "Last Log On Time")]
    
public object LastLogOnTime { getset; }

}

如果上述定义中的 [RegularExpressionAttribute("^[a-zA-Z][a-zA-Z0-9_]{4,}$", ErrorMessage = "Please enter a valid Log On Name.")]是在数据库中已经存在数据记录后添加,则可能会引发保存数据时的验证异常,即使没有编辑LogOnName列。

假设数据库Users表中有一行记录的LogOnName的值是123456,则下面的代码就会抛出异常: 

{
    ...
    var User 
= db.Users.Find(id)
    User.LastLogOnTime
=DateTime.Now();
    db.SaveChanges();  
// will raise validation exception here!
    ...
}

由此推断,Entity Framework在修改数据时会检查实体所有的属性是否符合验证规则,不管属性是否会在本次修改数据操作中更新,目前还没找到解决办法。 

原文地址:https://www.cnblogs.com/jlzhou/p/2050867.html