2014-11-23 73 views
3

我就遇到了這個錯誤試圖做一個插入時:PetaPoco - 如何關閉自動增量?

無法將NULL值插入列「ID」

原來PetaPoco默認假定ID列自動遞增,所以即使你提供了一個值,它也會試圖插入null。我在這裏發現了一個bug問題單:https://dnntracker.atlassian.net/browse/DNN-23217

我使用PetaPoco的T4模板來生成我的數據庫類。我創建了一個部分類應用數據註釋來禁用自動增量:

[PrimaryKey("Id", autoIncrement = false)] 
public partial class Blah : DatabaseDB.Record<Database.Blah> 
{ 
} 

但是它似乎沒有效果。當我指定一個整數時,PetaPoco仍然試圖爲Id列插入空值。

+0

PetaPoco維護者在這裏。你使用什麼版本?你正在使用插入或保存方法?如果這是一個錯誤,你可以提出GH回購問題,以便我們解決它? – Plebsori 2016-01-14 07:00:32

+0

[Github上報告鏈接](https://github.com/CollaboratingPlatypus/PetaPoco)的情況下,你要提出一個問題 – Plebsori 2016-01-14 07:35:04

回答

6

我同意這是一個非常奇怪和令人困惑的行爲,因爲他們的API並不總是使用該屬性

有兩種方法,使其工作。

一種是通過不使用在您的示例屬性,然後使用帶有自動增量參數的重載方法,並且將其設置爲。下面是一個完整的例子:

// Create a PetaPoco database object 
var db = new PetaPoco.Database("ConnectionSt"); 

// Create an article 
var a = new Article 
{ 
    article_id = 152, 
    title = "My new article", 
    content = "PetaPoco was here", 
    date_created = DateTime.UtcNow 
}; 

// Insert it by turning off auto-increment 
db.Insert("articles", "article_id", false, a); 

另一種方法是用插入方法,它接受一個對象作爲參數:

// Create an article 
var a = new Articles 
{ 
    article_id = 1111, 
    title = "My new article", 
    content = "PetaPoco was here", 
    date_created = DateTime.UtcNow 
}; 

// Insert it by using the insert method that will use the attribute! 
db.Insert(a); 

接受一個對象作爲參數的過載是唯一一個使用PrimaryKey內部屬性,它應該像在方案中的魅力。

+0

謝謝,這兩種方法的工作。看起來像是檢查一個列是否設置爲Identity,或者不是自動處理它,這可能是微不足道的,但也許除此之外還有更多。 – Sgraffite 2014-11-24 00:49:22

+0

是的,這是一個有趣的。我們已經爲這兩種類型的ID進行了集成測試。 – Plebsori 2016-01-14 07:38:06