EF6 -在SaveChanges()之前截断字符串字段以避免DB冲突



我使用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); .

最新更新