Scala + Play + Slick + freeslick + MS SQL Server:SQLServerException:无法更新标识列'ID'

时间:2017-03-01 18:44:37

标签: scala playframework slick-3.0

这是一个非常简单的用例。读出实体并更新它。但光滑显然不知道不更新标识列。当然我做错了。

以下是我正在尝试做的一个例子。假设数据存在于表中,我刚刚省略了创建步骤。

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”=?其中“schema”。“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",
      ...
 )

1 个答案:

答案 0 :(得分:0)

update方法更改为此

def update(foo:Foo): Future[Int] = {
    db.run(Foos.filter(_.id === foo.id).map(_.bar).update(foo.bar))
}

早期版本的问题是您正在尝试更新主要自动包含ID以及从错误消息中看到的不允许使用的栏。