最近用Entity Framework 4.1做一个MVC3的网站应用的数据层,遇到一个问题,在修改或添加实体属性的验证后,对数据库中已经存在的数据编辑会有影响,即使当前的编辑操作没有涉及到修改验证规则的项,在SaveChanges()也会抛出异常。
比如说,有如下类定义:
public class User
{
public int UserId { get; set; }
public string LogOnName { get; set; }
public System.DateTime LastLogOnTime { get; set; }
}
public int UserId { get; set; }
public string LogOnName { get; set; }
public System.DateTime LastLogOnTime { get; set; }
}
相应的验证定义:
[MetadataType(typeof(UserMetaData))]
public partial class User
{
}
public class UserMetaData
{
[Display(Name = "User Id")]
public object UserId { get; set; }
[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 { get; set; }
[Display(Name = "Last Log On Time")]
public object LastLogOnTime { get; set; }
public partial class User
{
}
public class UserMetaData
{
[Display(Name = "User Id")]
public object UserId { get; set; }
[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 { get; set; }
[Display(Name = "Last Log On Time")]
public object LastLogOnTime { get; set; }
}
如果上述定义中的 [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!
...
}
...
var User = db.Users.Find(id)
User.LastLogOnTime=DateTime.Now();
db.SaveChanges(); // will raise validation exception here!
...
}
由此推断,Entity Framework在修改数据时会检查实体所有的属性是否符合验证规则,不管属性是否会在本次修改数据操作中更新,目前还没找到解决办法。