ServiceStack.OrmLite:实现自定义StringConverter会影响复杂的BLOB字段的列类型

时间:2018-07-24 13:02:48

标签: mysql blob servicestack ormlite-servicestack

在上一个SO question中,我问我在POCO中具有字符串属性时如何更改MySql列类型。

我回答自己的答案是实现自己的StringConverter。我想这是一种“可以”的方法。

但是,在my answer中,我指出,不仅我的string属性受到影响,所有那些复杂的属性以及OrmLite将它们作为JSON的地方都受到影响。

MySql中那些复杂列的字段类型也变得像varchar(255),它当然不会持续很长时间。

StringConverter非常简短易用:

  • 我说默认字符串长度是255:
StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
    converter.StringLength = 255;
  • 我希望定义为255个字符或更少的字符串道具为varchar(255)
  • 定义为> 255和<65535的字符串道具为text
  • 定义为> = 65535的字符串道具为longtext

MyStringConverter:

public class MyStringConverter : StringConverter
{
    public override string GetColumnDefinition(int? stringLength)
    {
        if (stringLength.GetValueOrDefault() == StringLengthAttribute.MaxText)
            return MaxColumnDefinition;

        if (stringLength.GetValueOrDefault(StringLength) <= 255)
        {
            return UseUnicode
            ? $"NVARCHAR({stringLength.GetValueOrDefault(StringLength)})"
            : $"VARCHAR({stringLength.GetValueOrDefault(StringLength)})";
        }
        else if (stringLength.GetValueOrDefault(StringLength) <= 65535)
        {
            return $"TEXT";
        }
        else
        {
            return "LONGTEXT";
        }
    }
}

但是,如上所述,一个看起来像这样的属性(ActionInfo仅包含一些字符串和List):

public List<ActionInfo> _AvailableActions { get; set; }

使用MyStringConverter时产生了这样的表:

enter image description here

不使用MyStringConverter ,该列将变为longtext

然后的问题是:我想念什么?我仍然希望将复杂的BLOBed字段变成长文本,以便可以进行JSON BLOBing。我希望StringConverter仅影响字符串属性?

1 个答案:

答案 0 :(得分:0)

blobed复杂类型的列定义应使用ReferenceTypeConverter,默认情况下它会解析为DialectProvider.GetStringConverter().MaxColumnDefinition;

如果要更改MySQL字符串的字符串行为,则应继承RDBMS特定的MySqlStringConverter,否则,您将返回继承继承的常规RDBMS行为,该行为将VARCHAR(8000)用于字符串和{{1} }。

或者,您可以在自己的String转换器中覆盖MaxColumnDefinition

MaxColumnDefinition