c# - ManyToOne 约束不起作用

标签 c# xamarin sqlite-net sqlite-net-extensions

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

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

最佳答案

是的,这很正常。 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 doesn't support adding constraints on ALTER statements ),如下所示:

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

显然,手动创建表会强制您不使用 SQLite-Net CreateTable 语句。

关于c# - ManyToOne 约束不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408073/

相关文章:

c# - 使用 PostSharp 同时验证多个项目中的类名

c# - 添加应用程序 list 以确保跨 Windows XP、Vista 和 7 提升权限的可靠性如何?

c# - 使用 MvvmCross 从 Xamarin Android 中的 MvxListView 中删除项目

c# - 在 Windows 8.1 (WinRT) 上调用 SQLite3.SetDirectory 会产生 System.AccessViolationException

c# - 是否可以使用 SQLite.Net-PCL 创建内存数据库?

c# - Assert.IsInstanceOfType 失败,即使它说两种类型相同

c# - 当我在表单 onsubmit 中有函数时,Ajax 不起作用

azure - Xamarin.Mac Azure 通知中心

C#/Xamarin : Appearing/Disappearing events don't fire

c# - Sqlite-net 从同一个类创建两个表