2014-11-23 63 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