PetaPoco - 如何关闭自动增量?

Posted

技术标签:

【中文标题】PetaPoco - 如何关闭自动增量?【英文标题】:PetaPoco - How to turn off auto increment? 【发布时间】:2015-01-21 13:47:06 【问题描述】:

我在尝试插入时遇到了这个错误:

无法将值 NULL 插入“Id”列

事实证明,PetaPoco 默认假定 Id 列是自动递增的,因此即使您提供了一个值,它也会尝试插入 null。我在这里找到了该问题的错误票:https://dnntracker.atlassian.net/browse/DNN-23217。

我正在使用 PetaPoco 的 T4 模板来生成我的数据库类。我创建了一个部分类并应用了数据注释来禁用自动增量:

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


但它似乎没有效果。当我指定一个整数时,PetaPoco 仍在尝试为 Id 列插入 null。

【问题讨论】:

这里是 PetaPoco 维护者。你用的是什么版本?您使用的是插入还是保存方法?如果是错误,您能否在 GH 存储库中提出问题以便我们修复它? Github report link 如果您想提出问题 注意应该是AutoIncrement,而不是autoincrement 【参考方案1】:

我同意这是一个非常奇怪和令人困惑的行为,因为他们的 API 并不总是使用该属性

有两种方法可以让它工作。

一种是不使用示例中的属性,而是使用带有 autoIncrement 参数的重载方法,并将其设置为 false。这是一个完整的例子:

// 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);

另一种是使用以对象为参数的insert方法:

// 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 属性的重载,它应该在您的场景中发挥作用。

【讨论】:

谢谢,这两种方法都有效。检查列是否设置为 Identity 或不自动处理似乎很简单,但也许还有更多。 是的,这很有趣。我们已经对这两种类型的 ID 进行了集成测试。

以上是关于PetaPoco - 如何关闭自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 petapoco 创建 DAL [关闭]

在 Android 的 Room 库中重置自动增量 [关闭]

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]

PetaPoco模糊查询

PetaPoco 笔记

在 PetaPoco 中,如何装饰具有多列主键的表