2017-03-01 4 views
0

これは本当に簡単な使用例です。エンティティを読み込んで更新します。しかし、見た目には、ID列を更新しないことは明らかではありません。確かに私は何か間違っている。Scala + Play + Slick + freeslick + MS SQL Server:SQLServerException:ID列 'ID'を更新できません

ここに私がしようとしているものの例があります。テーブルにデータが存在すると仮定し、作成手順を省略しました。

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列 'ID' を更新できません。

デバッグログは、SQL文を示しています

[デバッグ] s.j.J.statement - 準備声明:アップデート "スキーマ" "フー" "ID" = "バー" に設定=。??どこbuild.sbtから "スキーマ" "フー" "ID" = 1234

:。。

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", 
     ... 
) 

答えて

0

変更update方法この

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

に以前の問題点バージョンでは、エラーメッセージで表示されているように許可されていないbarとともに、プライマリauto inc idを更新しようとしていますか?

+0

私はワイドなテーブルを持っているので、この方法で各カラムを列挙する必要がありますか? –

関連する問題