gpt4 book ai didi

.net - 使用 SubSonic 和 sqlite 插入主键值 - 问题因为 SubSonic 认为列是 AutoIncrement 或不是

转载 作者:行者123 更新时间:2023-12-03 18:41:05 28 4
gpt4 key购买 nike

我正在使用 SubSonic 2.2 和 sqlite,在处理具有非 AUTOINCREMENT 的 INTEGER PRIMARY KEY 列的表时遇到了问题。根据faq :

If you declare a column of a table to be INTEGER PRIMARY KEY, then whenever you insert a NULL into that column of the table, the NULL is automatically converted into an integer which is one greater than the largest value of that column over all other rows in the table, or 1 if the table is empty.



所以 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,所以也许我不得不做一些难看的硬编码......

  • 还有其他想法或建议吗?

    最佳答案

    不幸的是,看起来我们的 SQLiteDataProvider 假设如果它是 Int64 PK,那么它是自动增量的。我现在正在查看源代码(我没有编写此提供程序),我可以看到加载架构的方式是使用 Connection.GetSchema - 它使用构建的 System.Data.Common.DbConnection 来获取架构对于表。

    这在大多数情况下都不是最理想的,因为它返回的信息有限。在这种情况下 - 它不会告诉我们该列是否为 AUTOINCREMENT。可能有更好的方法来询问 SQLite 表上的元信息 - 但不幸的是它没有被使用。

    简短的回答:如果可以的话,定义一个新的 PK,并使用另一个 key 作为引用。

    关于.net - 使用 SubSonic 和 sqlite 插入主键值 - 问题因为 SubSonic 认为列是 AutoIncrement 或不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283063/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com