ServiceStack.OrmLite:实现自定义 StringConverter 会影响复杂 BLOB 字段的列类型
ServiceStack.OrmLite: Implementing custom StringConverter affects column type of complex BLOB fields
在之前的 中,我询问了当我的 POCO 中有字符串属性时如何更改 MySql 列类型。
我自己回答的答案是实现我自己的 StringConverter。我认为这是一种接受table的方法。
然而,在 中,我注意到不仅我的 string
属性受到影响,所有那些复杂的属性以及 OrmLite 将它们 BLOB 为 JSON 的所有属性也受到影响。 =24=]
MySQL中那些复杂列的字段类型也变成了varchar(255)
,当然不会持续很长时间。
StringConverter 非常简短易用:
- 我说默认字符串长度是255:
StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
converter.StringLength = 255;
- 我希望定义为 255 个字符或更小的字符串属性为
varchar(255)
- 字符串属性定义为 > 255 且 < 65535 为
text
- 字符串属性定义为 >= 65535 为
longtext
我的字符串转换器:
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 只包含一些字符串和列表):
public List<ActionInfo> _AvailableActions { get; set; }
在使用 MyStringConverter 时产生了这样的 table:
没有使用MyStringConverter
,该列变成了longtext
。
那么问题是:我错过了什么? 我仍然希望复杂的 BLOB 字段成为长文本,以便 JSON BLOB 可以完成。我希望 StringConverter 只影响字符串属性?
blobed 复杂类型的列定义应使用默认解析为 DialectProvider.GetStringConverter().MaxColumnDefinition;
的 ReferenceTypeConverter
如果您想更改 MySQL 字符串的字符串行为,您应该继承特定于 RDBMS 的 MySqlStringConverter
,否则您将恢复为继承使用 VARCHAR(8000)
的通用 RDBMS 行为字符串和 MaxColumnDefinition
.
或者,您可以在自己的字符串转换器中覆盖 MaxColumnDefinition
:
public override string MaxColumnDefinition => "LONGTEXT";
在之前的
我自己回答的答案是实现我自己的 StringConverter。我认为这是一种接受table的方法。
然而,在 MySQL中那些复杂列的字段类型也变成了 StringConverter 非常简短易用: 我的字符串转换器: 但是,如上所述,属性 看起来像这样(ActionInfo 只包含一些字符串和列表): 在使用 MyStringConverter 时产生了这样的 table: 没有使用 那么问题是:我错过了什么? 我仍然希望复杂的 BLOB 字段成为长文本,以便 JSON BLOB 可以完成。我希望 StringConverter 只影响字符串属性?string
属性受到影响,所有那些复杂的属性以及 OrmLite 将它们 BLOB 为 JSON 的所有属性也受到影响。 =24=]
varchar(255)
,当然不会持续很长时间。
StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
converter.StringLength = 255;
varchar(255)
text
longtext
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";
}
}
}
public List<ActionInfo> _AvailableActions { get; set; }
MyStringConverter
,该列变成了longtext
。
blobed 复杂类型的列定义应使用默认解析为 DialectProvider.GetStringConverter().MaxColumnDefinition;
如果您想更改 MySQL 字符串的字符串行为,您应该继承特定于 RDBMS 的 MySqlStringConverter
,否则您将恢复为继承使用 VARCHAR(8000)
的通用 RDBMS 行为字符串和 MaxColumnDefinition
.
或者,您可以在自己的字符串转换器中覆盖 MaxColumnDefinition
:
public override string MaxColumnDefinition => "LONGTEXT";