mysql - ServiceStack.OrmLite:实现自定义 StringConverter 会影响复杂 BLOB 字段的列类型
问题描述
在之前的SO question中,我询问了当我的 POCO 中有字符串属性时如何更改 MySql 列类型。
我自己回答的答案是实现我自己的 StringConverter。这是一种可以接受的方法,我想。
但是,在我的回答中,我注意到不仅我的string
属性受到影响,所有那些复杂的属性以及 OrmLite BLOB 将它们作为 JSON 的地方也受到影响。
MySQL中那些复杂列的字段类型也变成了like 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 时生成这样的表:
不使用MyStringConverter
,列就变成了longtext
。
那么问题是:我错过了什么?我仍然希望复杂的 BLOBed 字段变为长文本,以便可以完成 JSON BLOBing。我希望 StringConverter 只影响字符串属性?
解决方案
blobbed 复杂类型的列定义应使用默认解析为的ReferenceTypeConverterDialectProvider.GetStringConverter().MaxColumnDefinition;
如果要更改 MySQL 字符串的字符串行为,则应继承特定于 RDBMS 的MySqlStringConverter
行为,否则将恢复为继承VARCHAR(8000)
用于字符串和MaxColumnDefinition
.
MaxColumnDefinition
或者,您可以在自己的字符串转换器中覆盖:
public override string MaxColumnDefinition => "LONGTEXT";
推荐阅读
- python - 如何在pygame窗口中单击的任何位置绘制一个正方形
- swift - 使用 facebook graph API 快速发出 HTTPS POST 请求
- javascript - servlet 接收 JSON 帖子,但不显示它
- php - php 将多个字符串与 1 个值进行比较
- android - 有时包含数据,有时不包含数据的 Arraylist
- c - 使用 for 循环将递归函数转换为纯递归
- angularjs - 创建json数组并在angularjs中单击按钮时向其中添加对象
- php - 使用 PHP 处理 Webhook
- matplotlib - 使用 matplotlib 的 Wordcloud 未显示
- javascript - 无法使用 onfocus 事件在 javascript 中隐藏元素