我使用的是使用数据库优先方法的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个,然后将完整的对象传递给DB插入。

我知道执行此操作的几种方法,我正在通过创建Extension方法尝试以下一种方法。

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类的所有字段上。

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

请同样帮我。

最佳答案

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

10-06 13:28
查看更多