【发布时间】:2011-01-17 23:47:09
【问题描述】:
我正在使用 SubSonic 2.2 和 sqlite,在处理具有非 AUTOINCREMENT 的 INTEGER PRIMARY KEY 列的表时遇到了问题。根据faq:
如果您将表的列声明为 INTEGER PRIMARY KEY,那么每当您在表的该列中插入 NULL 时,NULL 会自动转换为比该列的最大值大 1 的整数表中的所有其他行,如果表为空,则为 1。
所以 sqlite 认为这些列有时会自动递增(即仅在提供 NULL 值时)。问题是 SubSonic 认为它们总是自动递增。
在我的应用程序中,我的 ID 值是从远程数据库生成的,所以我不想在 sqlite 中自动生成它们。这应该没问题:我将在此表中创建记录时简单地提供值。但是,当我使用 SubSonic 的 sonic.exe 自动生成我的 DAL 时,主键列设置为 AutoIncrement = true。这似乎意味着我无法设置 ID 列 - subsonic 的 ActiveHelper.GetInsertCommand() 会忽略它,因为它认为它是自动生成的。
判断是否自增的那一行在SubSonic.SQLiteDataProvider.GetTableSchema()中:
column.AutoIncrement = Convert.ToBoolean(row["PRIMARY_KEY"]) && GetDbType(row["DATA_TYPE"].ToString()) == DbType.Int64;
我想解决办法是要么
不对在别处生成的键使用 INTEGER PRIMARY KEY 列,或者
修改模板,使此类列不设置为 AutoIncrement = true。这意味着 SubSonic 永远不会将它们视为自动增量,因此我需要小心我以后不会期望获得自动生成的值。不幸的是,我认为无法在模板中轻松确定该列是否真的是 AUTOINCREMENT,所以也许我不得不做一些难看的硬编码......
还有其他想法或建议吗?
【问题讨论】:
标签: .net sqlite subsonic subsonic2.2