ServiceStack.OrmLite:StringLengthAttribute.MaxText产生“ LONGTEXT”-如何设置为“ TEXT”?

时间:2018-07-24 09:11:37

标签: mysql servicestack ormlite-servicestack

使用ServiceStack的OrmLite并使用以下属性装饰属性,创建一个LONGTEXT类型的列,而不是docs中所述的TEXT:

enter image description here

但是它变成了LONGTEXT:

enter image description here

我尝试将StringLenghtAttribute设置为其他内容,6553570000Int32.MaxValue等,但它要么将其解释为VARCHAR,然后给了我{{1 }}或Column length too big,或成为LONGTEXT。

问题是:如何强制它变成“ TEXT”(或mysql中的任何其他文本类型)?

我也许可以修改Row size too large并将其设置为MaxColumnDefinition,但是我永远不会得到我假设的LONGTEXT。 enter image description here

更新 TEXT设置为TEXT并没有改变

我可以用属性装饰类,以某种方式指定类型吗?还是特定于sql版本?

或者也许我应该重写MaxColumnDefinition并实现自己的逻辑...

1 个答案:

答案 0 :(得分:1)

(请注意,此解决方案还会产生其他问题,我将在单独的SO帖子中提出)

经过更多研究,可以解决创建我自己的StringConverter的问题,如下所示:

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";
        }
    }
}

我还建议将默认的StringLength设置为小于默认的8000:

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

这样,默认的string将是varchar(255)。如果您想将特定的字符串属性设置为其他属性,请根据MyStringConverter设置属性:

type = typeof(tWorks.Core.CoreCommons.ContactModuleProtocols.SMS.ModuleSettingsSMS);
type.GetProperty(nameof(MyClass.Prop1)).AddAttributes(new StringLengthAttribute(255)); // ==> varchar(255)
type.GetProperty(nameof(MyClass.Prop2)).AddAttributes(new StringLengthAttribute(500)); // ==> TEXT
type.GetProperty(nameof(MyClass.Prop3)).AddAttributes(new StringLengthAttribute(70000)); // ==> LONGTEXT