光滑的MSSQL插入对象与自动增量

时间:2013-08-05 15:44:59

标签: sql-server scala slick

我最近不得不将项目从MySQL迁移到MSSQL。我在我的id列上使用IDENTITY(1,1)表来匹配MySQL的自动增量功能。

当我尝试插入一个对象时,我收到了这个错误:

[SQLServerException: Cannot insert explicit value for identity column in table 'categories' when IDENTITY_INSERT is set to OFF.]

经过一些研究后我发现这是因为我试图在我的桌子上插入我的id(0)的值。例如,我有一个对象类别

case class Category(
  id: Long = 0L,
  name: String
)
object Category extends Table[Category]("categories"){

  def name = column[String]("name", O.NotNull)
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def * = id ~ name <> (Category.apply _, Category.unapply _)

  def add(model:Category) = withSession{ implicit session =>
    Category.insert(model)
  }
  def remove(id:Long) = withSession{implicit session =>
    try{Some(Query(Category).filter(_.id === id).delete)}
    catch{case _ => None}
  }
}

有没有办法将我的对象插入数据库并在没有MSSQL抛出SQLException的情况下忽略0L? MySQL只会忽略id的值,并像没有收到id一样进行增量。 我真的不想创建一个除了id之外的所有新案例类。

1 个答案:

答案 0 :(得分:1)

尝试重新定义这样的add方法,看看它是否适合您:

def add(model:Category) =  withSession{ implicit session =>
  Category.name.insert(model.name)
}

如果您有更多列,那么您可以在Category表类中添加forInsert投影,指定除id之外的所有字段,但由于您没有,这应该可以改为。

修改

现在,如果你的表对象上有两个以上的字段,那么你可以做这样的事情,这在Lifted Embedding文档here中有描述:

case class Category(
  id: Long = 0L,
  name: String,
  foo:String
)
object Category extends Table[Category]("categories"){
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name", O.NotNull)
  def foo = column[String]("foo", O.NotNull)

  def * = id ~ name ~ foo <> (Category.apply _, Category.unapply _)

  def forInsert = name ~ foo <> (t => Category(0L, t._1, t._2), {(c:Category) => Some(c.name, c.foo)})

  def add(model:Category) =  withSession{ implicit session =>
    Category.forInsert insert model
  }
  def remove(id:Long) = withSession{implicit session =>
    try{Some(Query(Category).filter(_.id === id).delete)}
    catch{case _ => None}
  }

  def withSession(f: Session => Unit){

  }
}