我最近不得不将项目从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之外的所有新案例类。
答案 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){
}
}