zoukankan      html  css  js  c++  java
  • 关于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在修改数据时会检查实体所有的属性是否符合验证规则,不管属性是否会在本次修改数据操作中更新,目前还没找到解决办法。 

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/jlzhou/p/2050867.html
Copyright © 2011-2022 走看看