2013-08-05 146 views
0

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

当我尝试虽然插入的对象,我得到这个错误:

[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之外的所有东西。

回答

1

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

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

如果你有更多的列,那么你可以添加一个forInsert投影至指定的所有字段除了id您的分类表类,但是因为你不这样做,所以应该这样做。

编辑

现在,如果你对你的表对象超过2场,那么你可以做这样的事情,这是抬举嵌入文档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){ 

    } 
} 
+0

最我的对象至少有6个字段,那么有没有一种方法可以在不重写所有字段的情况下进行此投影?重写除一个字段以外的所有内容似乎很不雅观。因为如果我想添加一个字段,它必须在多个地方。 – kingdamian42

+0

@ kingdamian42,我添加了更多的代码,有两个以上的字段。我希望这是你正在寻找的。 – cmbaxter

+0

是的,谢谢,这是关于我所提出的。我只是希望有一种方法,我不需要做太多的硬编码。因为现在如果我想添加一些东西,我必须将它添加到case类中,在对象中添加def,将它添加到*,将其添加到forInsert,并将其添加到数据库。这只是很多补充,你会认为它可以合并成一个点。我想现在不得不这样做,谢谢。 – kingdamian42