首先编写 EF 的代码,如何在数据库中的表之间设置外键的情况下定义导航属性关系

本文关键字:设置 之间 情况 情况下 属性 导航 下定义 性关系 数据库 EF 代码 | 更新日期: 2023-09-27 18:35:17

>我首先使用实体框架的代码。有两个类"问题"和"用户"。我定义了一个关系如下:

this.HasRequired(v => v.Creator).WithMany(v => v.Questiones)
.HasForeignKey(v => v.CreatorId).WillCascadeOnDelete(false);

在对数据库进行研究后,我发现它总是在用户的 Id 和问题的 CreatorId 之间创建外键。由于FK的性能较低(以及其他原因),我想定义导航属性关系而不在数据库中设置外键?EF 创建 FK 后删除它?如果不能使用流畅的 API 做到这一点,你能告诉我为什么 EF 以这种方式设计吗?

关于FK的较低性能。我有一个包含 500 万条记录的用户表。当我将问题插入数据库时,因为数据库会检查问题。来自用户表的 CreatorId 验证,它总是比没有 FK 慢。还有许多其他原因需要我删除 FK。

我想我有点痴迷,因为我认为在创建后删除FK既奇怪又丑陋。我想要的是通过在流畅的 api 中使用类似 WithoutForeignKey 的东西来实现这一点:

this.HasRequired(v => v.Creator).WithMany(v => v.Questiones)
.WithoutForeignKey(v => v.CreatorId).WillCascadeOnDelete(false); 

首先编写 EF 的代码,如何在数据库中的表之间设置外键的情况下定义导航属性关系

毫无疑问,

你为什么要做这个奇怪的事情,只去回答:你可以在生成后删除 fk 约束,或者你可以使用迁移并从迁移代码中删除 FK 生成。

即使 fk 约束不存在,遍历导航属性时生成的 SQL 代码也将起作用,但级联删除除外

如果要在两个表之间建立关系,则需要定义一个外键。没办法。即使您在流畅的 API 中使用Map(),也只能在模型中隐藏外键,在后台 EF 仍将使用它,并且它将存在于数据库中。

我也不明白你所说的外键"性能"是什么意思?一个额外的(可能很小的)列不会有什么不同。如果您指的是性能部分的导航属性,则可以执行 3 项操作:

  1. 不要将它们包含在模型中
  2. 使它们非虚拟以禁用延迟加载
  3. 禁用延迟加载以及ctx.Configuration.LazyLoadingEnabled = false;

如果您不想告诉 db 关系并将两个实体视为不相关(我想知道为什么),那么只需忽略这些导航属性和 FK 字段。请注意,您将负责管理相关实体:从数据库保存和加载它们,更新 id 等

this.Ignore(q => q.Creator);
this.Ignore(q => q.CreatorId);

并且您还需要忽略关系的另一端,否则EF将生成默认名称为Creator_CreatorId的FK列。因此,在Creator实体配置中:

this.Ignore(c => c.Questiones);