对于Slick模型,Case类可选但必需字段

use*_*049 5 scala slick

这可能有点鸡和鸡蛋的问题,但这是情况,我想听听你的意见.

有一个简单的case class例子

case class Person(id:Option[Int],firstName:Option[String] ...)
Run Code Online (Sandbox Code Playgroud)

现在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)
Run Code Online (Sandbox Code Playgroud)

现在之所以将id其定义为Optiona,case class是因为Person在app中的其他位置使用了相同的类.例如JSON,在控制器层中序列化/反序列化.当请求进入创建新记录时,显然id不会在传入中传递JSON.同时,当一个人试图从案例类中检索值时Option,id可能会误导,id因为那不是一个可选字段.IMO,当我看到Option类型我认为这可能有NoneSome但在这种情况下它总是有一个值,来自Slick/db,所以定义它Option是误导性的.

我可以将它定义为case class Person(id : SOME_CONST_NUM, firstName :Option[String] ..)每当你将其传递给Slick进行插入时,Slick将插入一个PK值.从PersonPerson.id那里检索数据总是可以获得Slick为您提供的价值.用法明智,这是明确和更合适的.但是,这个硬编码的默认设置SOME_CONST_NUM是丑陋和代码味道.

id在这种情况下,您如何定义字段?