Enums vapor 4和fluent的枚举给出错误

Enums vapor 4和fluent的枚举给出错误,enums,vapor,vapor-fluent,Enums,Vapor,Vapor Fluent,这让我困惑: 我有一个要使用枚举的模型。我首先声明枚举: enum MenuChoices:字符串,可编码{ 可到达的情况 个案处理 个案探访 案例推理问题 } 然后在我的类字段中: @Enum(键:“菜单选项”) 变量menuChoices:menuChoices 然后,我使用迁移在数据库中创建它: struct CreateUserMenu:迁移{ func prepare(关于数据库:database)->EventLoopFuture{ 返回database.enum(“菜单选项”)

这让我困惑:

我有一个要使用枚举的模型。我首先声明枚举:

enum MenuChoices:字符串,可编码{
可到达的情况
个案处理
个案探访
案例推理问题
}
然后在我的类字段中:

@Enum(键:“菜单选项”)
变量menuChoices:menuChoices
然后,我使用迁移在数据库中创建它:

struct CreateUserMenu:迁移{
func prepare(关于数据库:database)->EventLoopFuture{
返回database.enum(“菜单选项”)
.case(“可到达”)
.case(“注意”)
.案例(“访问原因”)
.案例(“原因/问题”)
.create()
.flatMap{中的菜单选项
返回database.schema(“用户菜单”)
.id()
.field(“创建时间,.datetime,.required”)
.field(“更新时间,.datetime,.required”)
.field(“已删除”、.datetime)
.field(“菜单选项”,菜单选项)
.field(“be_nl”,.string)
.field(“be_fr”,.string)
.field(“en_us”,.string)
.create()
}
}
}
到目前为止还不错。此迁移工作正常,数据库看起来正常。但是,当我想在另一次迁移中添加一些数据以作为数据库种子时,我会遇到一个错误:

let test=UserMenu(menuChoices:menuChoices.reachabaat,beNl:“nl”,beFr:“fra”,enUs:“eng”)
让=test.save(在:数据库上)

+App.addUserMenus默认设置
你想继续吗?
是/否>是
[ERROR]previousError(MySQL错误:服务器错误:第1行“菜单选项”列的数据被截断)
致命错误:顶层引发的错误:上一个错误(MySQL错误:服务器错误:第1行“菜单选项”列的数据被截断):file/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ErrorType.swift,第200行
USSS Voyager II:24您的数据$

不幸的是,这个错误并不能真正帮助找出问题的根源。问题在于枚举的swift定义和Fluent枚举之间没有映射。为swift枚举定义放置一个与Fluent的字符串文本值匹配的字符串文本值将解决此问题

enum MenuChoices: String, Codable {
    case reachableAt = "reachable_at"
    case attentionTo = "attention_to"
    case reasonVisit = "reason_visit"
    case reasonProblem = "reason_problem"
}

难道不仅仅是MenuChoices.reachableAt的字符串值解析为“reachableAt”,而是mysql枚举将查找“reachableAt”?我不这么认为。如果你看一下我的“struct CreateUserMenu:Migration{…”代码,你会发现在数据库级别我使用的是reachable_at。我刚才在这里看到了类似的代码:但没有看到与我的代码有任何区别:(关于你的操作方式:你使用myEnum.rawvalue()要将其保存到数据库中的字符串中?如果将swift enum大小写定义为case reachable=“reachable_at”?会发生什么情况?我不使用rawValue().Woehaa。现在可以了!如果您能回答我的问题,我可以接受您的答案!