gpt4 book ai didi

c# - ManyToOne 约束不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:02 27 4
gpt4 key购买 nike

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

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/

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