C#EF字符串长度在数据库插入之前使用POCO属性属性进行数据验证

时间:2016-07-19 10:43:32

标签: c# entity-framework

我使用数据库第一种方法使用实体框架,但我没有使用EDMX方法,而是我定义了我的POCO类,在DBContext中我将初始化器设置为NULL。因此它不应该尝试在数据库中创建对象。一切都按预期工作得很好。

在我的POCO类中,我将StringLength属性包装的属性定义为该属性的最大长度值,如下所示。

public class Users
    {
        [Key, Column(Order = 0)]
        [XmlIgnore]
        public long ID { get; set; }
        [XmlIgnore]
        [Key, Column(Order = 1)]
        public long? SrNo { get; set; }
        [XmlIgnore]
        public DateTime ScanDateTime { get; set; }
        [StringLength(255)]
        [XmlElement(ElementName = "username")]
        public string UserName { get; set; }
        [StringLength(75)]
        [XmlElement(ElementName = "lastlogon")]
        public string LastLogon { get; set; }
        [StringLength(75)]
        [XmlElement(ElementName = "lastlogoff")]
        public string LastLogoff { get; set; }
        [StringLength(1000)]
        [XmlElement(ElementName = "accountinfo")]
        public string AccountInfo { get; set; }
        [XmlIgnore]
        public DateTime DCDTime { get; set; }
        [XmlIgnore]
        public DateTime? LastModDTime { get; set; }
    }

我正在使用[XmlIgnore]属性进行XML反序列化。我通过反序列化XML数据来将数据填充到此类对象中。在许多情况下,XML可能包含数据长度超过POCO类中定义的StringLength的字段的数据。

我想在发送数据库插入之前验证数据并从那里获取失败。

我想检查并希望将数据修剪为StringLength属性属性中定义的指定长度。例如,在将XML数据反序列化为Users对象后,如果用户名超过75长度,那么我将其修剪为75,然后传递完整对象以进行数据库插入。

我知道这样做的几种方法,我通过创建扩展方法尝试如下方法。

public static void ValidateData(this List<Users> Data)
{
  int UserNamelength = typeof(Users).GetProperty("UserName ").GetCustomAttributes(typeof(StringLengthAttribute), false).Cast<StringLengthAttribute>().FirstOrDefault().MaximumLength;
  foreach (var item in Data)
  {
    if (item.UserName.Length > UserNamelength )
    {
    //Trim the UserName field to the length i.e. 75 characters
    }
  }
}

同样,我希望检查在Users类的所有字段上。

我正在寻找其他简单明了的解决方案。

请帮助我。

1 个答案:

答案 0 :(得分:0)

我可能会编写自定义反序列化代码,以便将XML中的数据截断为模型注释中指定的任何大小。这可能是更多的工作,但在我看来更清洁而不是验证。只是一个想法。