gpt4 book ai didi

c# - EF6 - 在 SaveChanges() 之前截断字符串字段以避免数据库冲突

转载 作者:行者123 更新时间:2023-11-30 18:19:04 38 4
gpt4 key购买 nike

我使用 Windows 服务通过 Entity Framework 6 Code First 定期将记录保存在数据库中。我的一些客户可能会根据数据库约束(字符串长度违规)发送错误数据。我的客户没有 HMI。

我正在寻找一种方法来在 SaveChanges() 之前截断这些字符串违规并记录它们。

我的第一个想法是循环所有验证错误并将字符串长度与数据库配置中的 StringLengthAttribute 进行比较:

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

您将需要您当前指定为“错误”的相同代码。

此外,不要让设置者修改正在设置的数据。 Setter 不应包含此类逻辑,getter 应返回已设置的相同数据。

相反,只设置正确的值。例如。 myEntity.MyString = userInput.Truncate(200);

关于c# - EF6 - 在 SaveChanges() 之前截断字符串字段以避免数据库冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39850346/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com