首页 > 解决方案 > ServiceStack.OrmLite:实现自定义 StringConverter 会影响复杂 BLOB 字段的列类型

问题描述

在之前的SO question中,我询问了当我的 POCO 中有字符串属性时如何更改 MySql 列类型。

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

但是,在我的回答中,我注意到不仅我的string属性受到影响,所有那些复杂的属性以及 OrmLite BLOB 将它们作为 JSON 的地方也受到影响。

MySQL中那些复杂列的字段类型也变成了like varchar(255),当然不会持续很长时间。

StringConverter 非常简单:

StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
    converter.StringLength = 255;

我的字符串转换器:

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 只包含一些字符串和列表):

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

使用 MyStringConverter 时生成这样的表:

在此处输入图像描述

使用MyStringConverter,列就变成了longtext

那么问题是:我错过了什么?我仍然希望复杂的 BLOBed 字段变为长文本,以便可以完成 JSON BLOBing。我希望 StringConverter 只影响字符串属性?

标签: mysqlblobservicestackormlite-servicestack

解决方案


blobbed 复杂类型的列定义应使用默认解析为的ReferenceTypeConverterDialectProvider.GetStringConverter().MaxColumnDefinition;

如果要更改 MySQL 字符串的字符串行为,则应继承特定于 RDBMS 的MySqlStringConverter行为,否则将恢复为继承VARCHAR(8000)用于字符串和MaxColumnDefinition.

MaxColumnDefinition或者,您可以在自己的字符串转换器中覆盖:

public override string MaxColumnDefinition => "LONGTEXT";

推荐阅读