servicestack.ormlite:stringlengthattribute.maxtext生成“longtext”-如何设置为“text”?

vql8enpb  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(602)

使用servicestack的ormlite并使用以下属性装饰属性,创建一个longtext类型的列,而不是文档中提到的o text:

但它变得很长:

我试着设置 StringLenghtAttribute 去做别的事, 65535 , 70000 , Int32.MaxValue 等等,但它要么把它解释成一个varchar,然后给我 Column length too big 或者 Row size too large ,或者说它变成了一个长话短说。
问题是:如何强制它变成“文本”(或mysql中的任何其他文本类型)?
我也许可以修改一下 MaxColumnDefinition 设置为 TEXT 但我想我永远也不会有长话短说了。

更新设置 MaxColumnDefinition 发短信什么都没变
我可以用一个属性来装饰类,以某种方式指定类型吗?或者这是不是太特定于sql版本了?
或者我应该推翻 GetColumnDefinition 实现我自己的逻辑。。。

9udxz4iz

9udxz4iz1#

(请注意,此解决方案会产生其他问题,我将在单独的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;

这样,默认 stringvarchar(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

相关问题