1

我的关系很简单,我的模型如下所示:

public class Project
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public string Name { get; set; }

    [ForeignKey(typeof(User))]
    public int ProjectManagerID { get; set; }

    [ManyToOne]
    public User ProjectManager { get; set; }
}

public class User
{
    public string Login { get; set; }

    [OneToMany]
    public List<Project> Projects { get; set; }
}

问题是我可以很容易地保存项目,它对用户的引用而不保存用户,而且我没有得到任何违反约束的异常。

database.Insert(new Project
    {
        Name = "aaa",
        ProjectManagerID = 8
    });

我什至可以使用无效的用户 ID 查询我的项目,但我在用户表中没有存储任何记录。另一个有趣的事情是,当我打开这个数据库时,我无法在我的 SQLite 管理工具中存储像上面那样的行,所以我确信我的数据库模式是好的。

这在带有 sqlite-net-extensions 的 sqlite-net PCL 库中是否正常?

更新:我的 sqlite 版本是 3.8.7.4

4

2 回答 2

3

是的,这很正常。SQLite-Net Extensions 建立在 SQLite-Net 之上,不支持外键约束,因此在数据库层没有声明外键。

使用核心 SQLite-Net 方法,该[ForeignKey]属性只是一个没有任何限制的整数属性,因此您可以随意修改它而不会出现运行时错误。

如果您的项目在数据库层需要外键约束,您可以使用Execute方法手动将约束添加到您想要的列。

更新:

SQLite 中默认禁用外键。要在 SQLite-Net 中启用外键,您必须将以下代码添加到程序的开头。该语句不持久化在数据库中,每次应用启动时都必须执行:

database.Execute("PRAGMA foreign_keys = ON");

要检查它是否已启用,您可以使用PRAGMA foreign_keys

int result = database.ExecuteScalar<int>("PRAGMA foreign_keys");
if (result == 1) {
    // Foreign keys enabled
}

启用后,您可以在表声明中添加外键(sqlite 不支持在ALTER语句上添加约束),如下所示:

CREATE TABLE child ( 
    id           INTEGER PRIMARY KEY, 
    parent_id    INTEGER, 
    description  TEXT,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);

显然,手动创建表会迫使您不使用 SQLite-NetCreateTable语句。

于 2015-02-09T11:27:31.343 回答
0

问题解决了。我忘记将我的数据库从资源文件夹(作为模板)复制到应用程序数据文件夹,所以从技术上讲,我的数据库是由 SQLite-Net 创建的,没有任何外键。感谢帮助

于 2015-02-09T15:05:39.673 回答