我使用的是使用数据库优先方法的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中的数据截断为模型注释中指定的任何大小。这可能是更多的工作,但我认为比验证更干净。只是一个想法。