2013-08-05 56 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