使用ServiceStack的OrmLite并使用以下属性装饰属性,创建一个LONGTEXT类型的列,而不是docs中所述的TEXT:
但是它变成了LONGTEXT:
我尝试将StringLenghtAttribute
设置为其他内容,65535
,70000
,Int32.MaxValue
等,但它要么将其解释为VARCHAR,然后给了我{{1 }}或Column length too big
,或成为LONGTEXT。
问题是:如何强制它变成“ TEXT”(或mysql中的任何其他文本类型)?
我也许可以修改Row size too large
并将其设置为MaxColumnDefinition
,但是我永远不会得到我假设的LONGTEXT。
更新 将TEXT
设置为TEXT并没有改变
我可以用属性装饰类,以某种方式指定类型吗?还是特定于sql版本?
或者也许我应该重写MaxColumnDefinition
并实现自己的逻辑...
答案 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