这可能有点鸡和鸡蛋的问题,但这是情况,我想听听你的意见。
有一个简单的case class
例如
case class Person(id:Option[Int],firstName:Option[String] ...)
现在Slick Table
类看起来如下
class Person(tag: Tag) extends Table[Person](tag, "person") {
def * = (id?, firstName) <> ((Person.apply _).tupled, Person.unapply)
def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
现在id
中Option
被定义为case class
的原因是因为在应用中的其他位置使用了相同的Person
类。例如序列化/反序列化控制器层中的JSON
。显然,当请求进入创建新记录时,id
将不会在传入的JSON
中传递。同时,Option
id
id
在尝试从案例类中检索Option
值时可能会产生误导,因为这不是一个可选字段。我看到None
类型的IMO我认为这可能有Some
或Option
,但在这种情况下,始终有一个值,来自Slick / db,因此将其定义为case class Person(id : SOME_CONST_NUM, firstName :Option[String] ..)
具有误导性。
我可以将其定义为Person
,因此无论何时将其传递给Slick进行插入,Slick都会插入一个PK值。从您总是Person.id
的{{1}}中检索数据并获取Slick为您提供的价值。用法明智,这是明确和更合适的。但是,拥有这个硬编码的默认值SOME_CONST_NUM
是丑陋的并且代码闻起来。
在这种情况下,您如何定义id
字段?