在上一个SO question中,我问我在POCO中具有字符串属性时如何更改MySql列类型。
我回答自己的答案是实现自己的StringConverter。我想这是一种“可以”的方法。
但是,在my answer中,我指出,不仅我的string
属性受到影响,所有那些复杂的属性以及OrmLite将它们作为JSON的地方都受到影响。
MySql中那些复杂列的字段类型也变得像varchar(255)
,它当然不会持续很长时间。
StringConverter非常简短易用:
StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
converter.StringLength = 255;
varchar(255)
text
longtext
MyStringConverter:
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";
}
}
}
但是,如上所述,一个看起来像这样的属性(ActionInfo仅包含一些字符串和List):
public List<ActionInfo> _AvailableActions { get; set; }
使用MyStringConverter时产生了这样的表:
不使用MyStringConverter
,该列将变为longtext
。
然后的问题是:我想念什么?我仍然希望将复杂的BLOBed字段变成长文本,以便可以进行JSON BLOBing。我希望StringConverter仅影响字符串属性?
答案 0 :(得分:0)
blobed复杂类型的列定义应使用ReferenceTypeConverter,默认情况下它会解析为DialectProvider.GetStringConverter().MaxColumnDefinition;
如果要更改MySQL字符串的字符串行为,则应继承RDBMS特定的MySqlStringConverter
,否则,您将返回继承继承的常规RDBMS行为,该行为将VARCHAR(8000)
用于字符串和{{1} }。
或者,您可以在自己的String转换器中覆盖MaxColumnDefinition
:
MaxColumnDefinition