我使用Windows服务定期在数据库中保存记录,首先使用实体框架6代码。我的一些客户可能会根据数据库约束发送坏数据(字符串长度违反)。我的客户没有HMI。
我正在寻找一种在SaveChanges()之前截断这些字符串违规并记录它们的方法。
我的第一个想法是循环所有的验证错误,并比较字符串长度StringLengthAttribute在db配置:
foreach (DbEntityValidationResult validationErrors in db.GetValidationErrors())
{
foreach (DbValidationError validationError in validationErrors.ValidationErrors)
{
//Test if EF6 value is longer than DB max size
//If greater, truncate it and log a warning message
}
}
我的其他(坏)解决方案是截断字符串字段在数据层,但它不是有效的。这是一个只有一个属性的糟糕示例…
private string pcName;
[Required]
[StringLength(100)]
public string PCName
{
get { return pcName; }
set
{
const int stringLengthAttribute = 100; // Should be equal to StringLengthAttribute
if (value.Length <= stringLengthAttribute)
pcName = value;
else
{
pcName = value.Substring(0, stringLengthAttribute);
Log.Warn("PC.pcName truncated from " + value + " to " + pcName);
}
}
}
有什么建议吗?
谢谢!
最好的解决方案通常是在数据进入系统时进行修复。甚至不要向数据库发送错误/未经验证的数据。这是没有意义的,因为你有相同的验证/修复代码,但在一个更糟糕的地方。
在你写
的地方 //Test if EF6 value is longer than DB max size
//If greater, truncate it and log a warning message
您将需要与当前指定为"bad"的代码相同的代码。
同样,不要让setter修改正在设置的数据。setter不应该包含这样的逻辑,getter应该返回与设置的数据相同的数据。
只设置正确的值。例:myEntity.MyString = userInput.Truncate(200);
.