0

我最近不得不将一个项目从 MySQL 转移到 MSSQL。我IDENTITY(1,1)在我的表的 id 列上使用以匹配 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}
  }
}

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

4

1 回答 1

1

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

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

如果您有更多列,那么您可以forInsert向 Category 表类添加一个投影,指定除 之外的所有字段id,但既然您没有,这应该可以代替。

编辑

现在,如果您的表对象上确实有 2 个以上的字段,那么您可以执行以下操作,这在此处的 Lifted Embedding 文档中有所描述:

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){

  }
}
于 2013-08-05T18:32:18.520 回答