servicestack.ormlite:实现自定义stringconverter会影响复杂blob字段的列类型

5rgfhyps  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(484)

在前面的一个so问题中,我问过当poco中有字符串属性时如何更改mysql列类型。
我自己回答的答案是实现我自己的stringconverter。我想这是一种可以接受的方法。
然而,在我的回答中,我注意到 string 属性受到影响,所有那些复杂的属性以及ormlite将它们作为json blobs的属性也受到影响。
mysql中那些复杂列的字段类型也变得类似 varchar(255) 当然不会持续太久。
stringconverter非常简单:
我说过默认的字符串长度是255:

  1. StringConverter converter = OrmLiteConfig.DialectProvider.GetStringConverter();
  2. converter.StringLength = 255;

我希望字符串道具被定义为255个字符或更小 varchar(255) 定义为>255和<65535的字符串道具 text 字符串道具定义为>=65535 longtext myString转换器:

  1. public class MyStringConverter : StringConverter
  2. {
  3. public override string GetColumnDefinition(int? stringLength)
  4. {
  5. if (stringLength.GetValueOrDefault() == StringLengthAttribute.MaxText)
  6. return MaxColumnDefinition;
  7. if (stringLength.GetValueOrDefault(StringLength) <= 255)
  8. {
  9. return UseUnicode
  10. ? $"NVARCHAR({stringLength.GetValueOrDefault(StringLength)})"
  11. : $"VARCHAR({stringLength.GetValueOrDefault(StringLength)})";
  12. }
  13. else if (stringLength.GetValueOrDefault(StringLength) <= 65535)
  14. {
  15. return $"TEXT";
  16. }
  17. else
  18. {
  19. return "LONGTEXT";
  20. }
  21. }
  22. }

但是,如上所述,这样的属性(actioninfo只包含一些字符串和列表):

  1. public List<ActionInfo> _AvailableActions { get; set; }

使用mystringconverter时生成如下表:

不使用 MyStringConverter ,该列成为 longtext .
问题是:我错过了什么?我仍然希望复杂的blobed字段成为longtext,以便可以完成json blobing。我希望stringconverter只影响字符串属性?

qlzsbp2j

qlzsbp2j1#

blobbed复杂类型的列定义应该使用referencetypeconverter,默认情况下它解析为 DialectProvider.GetStringConverter().MaxColumnDefinition; 您应该继承特定于rdbms的 MySqlStringConverter 如果您想更改mysql字符串的字符串行为,否则您将恢复为继承使用 VARCHAR(8000) 对于字符串和 MaxColumnDefinition .
或者,您可以覆盖 MaxColumnDefinition 在您自己的字符串转换器中:

  1. public override string MaxColumnDefinition => "LONGTEXT";

相关问题