代码之家  ›  专栏  ›  技术社区  ›  Ted

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

  •  0
  • Ted  · 技术社区  · 6 年前

    使用ServiceStack的ormLite并使用以下属性修饰属性,创建一个longText类型的列,而不是文档中注明的o文本:

    但它变长了:

    我尝试将 stringlenghtattribute to something else, 65535 , 70000 , int32.maxvalue etc,但它要么将其解释为varchar,并将 column length too big or row size too large ,or it been a longtext.

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

    我可能会修改 maxColumnDefinition 并将其设置为 text 但是我永远不会得到longtext。

    update setting the MaxColumnDefinition to text didnt change a thing

    我可以用一个属性来修饰这个类,以某种方式指定类型吗?或者这太特定于SQL版本?

    或者我应该重写 getColumnDefinition 并实现我自己的逻辑…

    enter image description here

    但它变得很长:

    enter image description here

    我试着设置 StringLenghtAttribute 去别的地方, 65535 , 70000 , Int32.MaxValue 等等,但它要么把它解释成一个varchar,然后给了我 Column length too big Row size too large 或者它变成了一个长期文本。

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

    我也许可以修改 MaxColumnDefinition 并将其设置为 TEXT 但我想我永远不会得到长期的。 enter image description here

    更新 设置 最大列定义 发短信没什么变化

    我可以用一个属性来修饰这个类,以某种方式指定类型吗?或者这太特定于SQL版本?

    或者我应该超越 GetColumnDefinition 实现我自己的逻辑…

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ted    6 年前

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

    我还建议将默认字符串长度设置为小于默认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