【问题标题】:Entity Framework referential integrity not being enforced未强制执行实体框架参照完整性
【发布时间】:2014-12-09 12:09:48
【问题描述】:

使用 EF6,我在 SQL 数据库中有两个表,我首先使用数据库从数据库创建 EF 图。

我的数据库在一个表的 PK 和另一个表的外键之间缺少外键约束。

我没有将外键约束添加到数据库中,而是将其创建为 EF 模型中的关联。

该关联在 EF 模型中看起来不错,它具有正确的主体和依赖关系。

但是,如果我在存在依赖项的情况下从主体表中删除一行,则不会启动参照完整性,并且主体行会被删除。

我知道我可以将关系添加到 SQL 数据库并从数据库更新模型。但我想了解 EF 的功能范围,以及是否应该可以在 EF 模型中添加关系但不能在 SQL 数据库中添加关系并使其仍然有效?

在我看来,如果关联(关系)存在于 EF 中但不存在于 MSSQL 中,那么当您通过 EF 删除一行时,该关联会因为引用完整性而被忽略?

【问题讨论】:

  • 你想要的功能已经存在于 EF 中,你只想正确使用它,如果你想删除父级并强制其所有依赖项也被删除,你需要将级联删除设置为 true。查看您的迁移文件设置的内容。此外,在删除父级时,您可能还需要加载其所有子级。
  • 谢谢。我不是在寻找级联删除,我希望在尝试删除存在相关依赖行的主体行时引发参照完整性异常。正如我在问题中所说,我可以将关系添加到数据库模式中,但我想了解 EF 在参照完整性方面对关联的作用。似乎 EF 允许您创建一个关联,如果在 db 模式中没有对应关系,则该关联不涉及参照完整性?

标签: sql-server database entity-framework


【解决方案1】:

但是,如果我在存在依赖项的情况下从主体表中删除一行,则不会启动参照完整性,并且主体行会被删除。

依赖项存在于数据库中,还是存在于上下文中?

如果您尚未在上下文中加载所有依赖实体,则 EF 无法删除它们。它需要删除语句的密钥。如果它们不在上下文中,它甚至都不知道它们存在。

因此,引用完整性起作用的唯一方法是,如果 EF 在删除主体实体时将所有相关实体检索到上下文中,那么它可以为每个实体发出一个删除语句(即使有数千个) .

不过,我认为,如果上下文中存在依赖实体,EF 无论如何都会发出 delete 语句(即使它希望 db 完成所有工作)。

希望对您有所帮助。

【讨论】:

  • 谢谢。依赖项存在于数据库中,我不会将依赖项加载到上下文中,因为我使用的是 OData 客户端并且不想通过网络带来额外的数据。我只是在研究为什么没有引用完整性(我不想要级联删除,当我尝试删除存在依赖行的主体行时,我想要一个引用完整性异常)。从您所说的看来,如果基础数据库方案中没有相同的关系,那么在 EF 中创建的关联本身就不会强制执行引用完整性。
  • 不,它只会强制加载实体的参照完整性,没有别的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2012-07-14
相关资源
最近更新 更多