这是一个非常简单的用例。阅读实体并进行更新。但是Slick显然不知道不更新身份列。我当然做错了。
这是我想做的示例。假设数据中存在数据,我刚刚省略了创建步骤。
case class Foo(id:Option[Long], bar:String)
class FooTable(tag:Tag) extends Table [Foo](tag, Some("schema"), "Foo") {
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def bar = column[String]("bar")
def * = ( id, bar) <> ((Foo.apply _).tupled, Foo.unapply)
}
class FooDAO @Inject() (protected val dbConfigProvider: DatabaseConfigProvider)(implicit ec:ExecutionContext) {
val dbConfig = dbConfigProvider.get[JdbcProfile]
val db = dbconfig.db
val Foos = TableQuery[FooTable]
def get(id:Long): Future[Option[Foo] = {
db.run(Foos.filter(_.id === id).result.headOption)
}
def update(foo:Foo): Future[Int] = {
db.run(Foos.filter(_.id === foo.id).update(foo))
}
}
...
class FooController @Inject(fooDao:FooDAO)(implicit ec:ExecutionContext) extends Controller {
...
private def doFooUpdate(id:Long, newBar:String): Unit = {
fooDao.get(id).map { fooOption =>
// assume it exists and the .get() doesn't throw exception
fooDao.update(fooOption.get().copy(bar=newBar)) // kaboom
}
}
}
例外是:
例外:com.microsoft.sqlserver.jdbc.sqlserverexception:无法更新身份列'id'。
调试记录显示SQL语句:
[debug] s.j.j.statement-准备语句:更新" schema"。" foo"设置" id" =?," bar" =?其中"架构"。" foo"。" id" = 1234
来自build.sbt:
libraryDependencies ++= Seq(
...
"com.typesafe.play" %% "play-slick" % "2.0.2",
"com.typesafe.play" %% "play-slick-evolutions" % "2.0.2",
"com.typesafe.slick" %% "slick" % "3.1.0",
"org.suecarter" %% "freeslick" % "3.1.1.2",
...
)
将update
方法更改为
def update(foo:Foo): Future[Int] = {
db.run(Foos.filter(_.id === foo.id).map(_.bar).update(foo.bar))
}
较早版本的问题是您正在尝试更新主要的Auto Inc ID和BAR,这是您从错误消息中看到的。