首先编写 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);
你为什么要做这个奇怪的事情,只去回答:你可以在生成后删除 fk 约束,或者你可以使用迁移并从迁移代码中删除 FK 生成。
即使 fk 约束不存在,遍历导航属性时生成的 SQL 代码也将起作用,但级联删除除外
如果要在两个表之间建立关系,则需要定义一个外键。没办法。即使您在流畅的 API 中使用Map()
,也只能在模型中隐藏外键,在后台 EF 仍将使用它,并且它将存在于数据库中。
我也不明白你所说的外键"性能"是什么意思?一个额外的(可能很小的)列不会有什么不同。如果您指的是性能部分的导航属性,则可以执行 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);