我正在使用 SubSonic 2.2 和 sqlite,在处理具有非 AUTOINCREMENT 的 INTEGER PRIMARY KEY 列的表时遇到了问题。根据常见问题解答:
如果您将表的一列声明为 INTEGER PRIMARY KEY,那么每当您在表的该列中插入 NULL 时,NULL 都会自动转换为一个整数,该整数比该列在所有其他行中的最大值大一在表中,如果表为空,则为 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,所以也许我不得不做一些难看的硬编码......
还有其他想法或建议吗?