ServiceStack.OrmLite:StringLengthAttribute.MaxText 产生 "LONGTEXT" - 我如何设置为 "TEXT"?
ServiceStack.OrmLite: StringLengthAttribute.MaxText produces "LONGTEXT" - how can I set to "TEXT"?
使用 ServiceStack 的 OrmLite 并使用以下属性装饰 属性,创建一个 LONGTEXT 类型的列,而不是文档中所述的文本:
但是变成了LONGTEXT:
我尝试将 StringLenghtAttribute
设置为其他内容,65535
、70000
、Int32.MaxValue
等,但它要么将其解释为 VARCHAR 并给了我 Column length too big
或 Row size too large
,或者它变成了 LONGTEXT。
问题是:如何强制它变成“TEXT”(或 mysql 中的任何其他文本类型)?
我也许可以修改 MaxColumnDefinition
并将其设置为 TEXT
但我认为我永远不会得到 LONGTEXT。
更新
将 MaxColumnDefinition
设置为 TEXT 并没有改变任何事情。
我可以用属性修饰 class 并以某种方式指定类型吗?还是那也是 sql-特定于版本的?
或者也许我应该覆盖 GetColumnDefinition
并实现我自己的逻辑...
(请注意,此解决方案会产生其他问题,我将在单独的 SO post 中提出这些问题)
经过更多研究,解决了创建我自己的 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
使用 ServiceStack 的 OrmLite 并使用以下属性装饰 属性,创建一个 LONGTEXT 类型的列,而不是文档中所述的文本:
但是变成了LONGTEXT:
我尝试将 StringLenghtAttribute
设置为其他内容,65535
、70000
、Int32.MaxValue
等,但它要么将其解释为 VARCHAR 并给了我 Column length too big
或 Row size too large
,或者它变成了 LONGTEXT。
问题是:如何强制它变成“TEXT”(或 mysql 中的任何其他文本类型)?
我也许可以修改 MaxColumnDefinition
并将其设置为 TEXT
但我认为我永远不会得到 LONGTEXT。
更新
将 MaxColumnDefinition
设置为 TEXT 并没有改变任何事情。
我可以用属性修饰 class 并以某种方式指定类型吗?还是那也是 sql-特定于版本的?
或者也许我应该覆盖 GetColumnDefinition
并实现我自己的逻辑...
(请注意,此解决方案会产生其他问题,我将在单独的 SO post 中提出这些问题)
经过更多研究,解决了创建我自己的 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