gpt4 book ai didi

c# - SubSonic 无法识别 SQLite 外键

转载 作者:行者123 更新时间:2023-11-30 14:41:55 30 4
gpt4 key购买 nike

我正在使用 SubSonic 3.0.0.3,我似乎无法让 ActiveRecord .tt 文件识别和生成 SQLite 数据库中外键和关系的代码。

我认为它生成其他一切都很好,但在查看其他在线片段后,看起来生成的代码应该比 ActiveRecord.csStructs.cs 中的单个类更多 对于我的每个表。查看 Structs.cs 内部,IsForeignKey 对于每一列始终是 false,即使是我为其定义了外键的列。此外,每个生成的 ActiveRecord 类中的每个 Foreign Keys 区域都是空的。

我在我的项目中使用 VS2008 并引用了 SubSonic 3.0.0.3、System.Data.SQLite 1.0.66.0 和 System.Data.SQLite.Linq 2.0.38.0。我使用 SQLite Expert Personal 3.1.0.2076 创建了数据库。我制作了一些虚拟表格来尝试测试 SubSonic 如何处理一个:多个和多个:多个关系。这是 DDL SQLite Expert 为我的小型数据库吐出的内容:

CREATE TABLE [Person] (
[PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[PersonName] TEXT NOT NULL,
[PersonAge] INT NOT NULL
);

CREATE TABLE [Group] (
[GroupID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[GroupName] TEXT NOT NULL,
[GroupDescription] TEXT NOT NULL
);

CREATE TABLE [Dog] (
[DogID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[PersonID] INT NOT NULL CONSTRAINT [DogPersonFK] REFERENCES [Person]([PersonID]) ON DELETE CASCADE ON UPDATE CASCADE,
[DogName] TEXT NOT NULL);

CREATE TABLE [GroupPersons] (
[GroupID] INTEGER NOT NULL CONSTRAINT [GroupPersonToGroupFK] REFERENCES [Group]([GroupID]) ON DELETE CASCADE ON UPDATE CASCADE,
[PersonID] INTEGER NOT NULL CONSTRAINT [GroupPersonToPersonFK] REFERENCES [Person]([PersonID]) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT [sqlite_autoindex_GroupPersons_1] PRIMARY KEY ([GroupID], [PersonID]));

我知道外键已启用并在数据库中工作 - SQLite 专家说它们已打开,当我在一个地方更改数据时,例如 Person 的 PersonID,它确实会更改 Dog 和 GroupPersons 表中的 PersonID。我已经尝试将数据库重新添加到项目中,“运行自定义工具”以使 .tt 文件再次执行,甚至删除它们并重新添加它们。我可以获得一个简单的项目来构建它执行简单的查询和插入,但是我刚才尝试更改单个人、狗或组的主键和 x.Save() 但 System.Data.SQLite 抛出了一个异常所有这三个,在 Save() 处说 SQLite error near "WHERE":syntax error.

对我接下来应该尝试做什么有什么建议吗?

最佳答案

似乎每个表的 FKTables 属性都没有在文件“SQLite.ttinclude”中分配。所以我添加了一些代码行并设法生成外键代码:

在第 16 行(var schema = conn.GetSchema("COLUMNS");)之后,插入:

var schemaForeignKeys = conn.GetSchema("FOREIGNKEYS");

在第 29 行 (tbl.Name = row["TABLE_NAME"].ToString();) 之后,插入:

tbl.FKTables = new List<FKTable>();
var foreignKeyTables = schemaForeignKeys.Select("TABLE_NAME='" + tbl.Name + "'");
foreach (var foreignKeyTable in foreignKeyTables) {
FKTable foreignKey = new FKTable();
foreignKey.ThisTable = foreignKeyTable["TABLE_NAME"].ToString();
foreignKey.ThisColumn = foreignKeyTable["FKEY_FROM_COLUMN"].ToString();
foreignKey.OtherTable = foreignKeyTable["FKEY_TO_TABLE"].ToString();
foreignKey.OtherColumn = foreignKeyTable["FKEY_TO_COLUMN"].ToString();
foreignKey.OtherClass = CleanUp(foreignKey.OtherTable);
foreignKey.OtherQueryable = foreignKey.OtherClass;
tbl.FKTables.Add(foreignKey);
}

在第 53 行(col.IsNullable=row["IS_NULLABLE"].ToString()=="True";)之后,插入:

col.IsForeignKey = tbl.FKTables.Any(x => x.ThisColumn == col.Name);

这是为了生成外键代码。

此外,当您必须删除一条记录,该记录的列作为其他表中的外键时,您可能会遇到问题?举个例子 :人(身份证,姓名)狗(Id,#PersonId)如果您已将#PersonId 外键删除操作设置为“SET TO NULL”,这将不起作用,因为在 SQLite 3.6.23.1(Data.SQLite 1.0.66.0 使用的版本)中默认禁用外键支持。要启用外键支持,您必须对每个连接执行此命令:

PRAGMA foreign_keys = ON;

现在,Data.SQLite 不支持它,但它支持(在版本 1.0.67.0 中,http://sqlite-dotnet2.cvs.sourceforge.net/viewvc/sqlite-dotnet2/SQLite.NET/System.Data.SQLite/SQLiteConnection.cs?r1=1.80&r2=1.81)。

因此您必须等待发布,或者您可以(像我一样)下载 Data.SQLite 源代码并编译最新版本。它对我很有用。

祝你好运。对不起我的英语:)

关于c# - SubSonic 无法识别 SQLite 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3552902/

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