c# - EF Core 2 - 只有 1 个导航属性/关系知识的关系?

标签 c# database entity-framework entity-framework-core ef-fluent-api

我正在将 ASP.NET Core 2.2 与 EF Core 2.2 和 SQL 服务器一起使用。

我目前正在开发一项功能,其中包含以下类:

TABLE Foo
-------------------------------------------------------------
Column                       Type          Remark
--------------------------------------------------------------
Id                           GUID          PK
IntroId                      GUID?         Nullable FK
IntroText                    Content       Navigation Property
--------------------------------------------------------------

TABLE Content
--------------------------------------------------------------
Column                       Type          Remark
--------------------------------------------------------------
Id                           GUID          PK
Text                         string
--------------------------------------------------------------

这是与我的问题相关的 Fluent API 配置:

builder.HasOne(b => b.IntroText)
    .WithOne()
    .IsRequired(false);

内容
内容只有自己的配置。

内容可以包含很多文本,由于某些原因,这些东西没有直接保存在 Foo 表/类中。

如您所见,我试图确保 Content 没有指向 Foo 的外键/导航属性。这是因为这些属性不是 Content 的一部分,并且因为在未来更多的类/表可以包含保存在 Content< 中的类似 IntroText 的内容 表,我不希望 Content 充满可为空的外键/导航属性。

这在 EF Core 中可行吗?

我现在得到的错误:

无法确定“Foo.IntroText”和“Content”之间的一对一关系的子/从属方。要识别关系的子/依赖方,请配置外键属性。如果这些导航不应属于同一关系的一部分,请在不指定反向的情况下配置它们。参见 http://go.microsoft.com/fwlink/?LinkId=724062了解更多详情。


我会接受允许数据库具有我在代码库中看不到的关系的答案,但我更希望 ContentFoo 一无所知>

非常感谢您的帮助!

最佳答案

如果您在 Foo 实体中公开了一个 IntroTextId,那么您需要将其关联为一对一关系中的 FK:

builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey(b => b.IntroTextId)
    .IsRequired(false);

通常我不希望 FK 属性在我的实体中公开,因为这会导致引用实体的两个真实来源。 (Foo.IntroTextId 与 Foo.IntroText.IntroTextId)在这种情况下,您利用 FK 的阴影属性:

builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey("IntroTextId")
    .IsRequired(false);

这类似于(并且更直观)在 EF 6 中使用 Map(MapKey) 在不公开属性的情况下映射 FK。

.Map(x => x.MapKey("IntroTextId"));

关于c# - EF Core 2 - 只有 1 个导航属性/关系知识的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56171197/

相关文章:

javascript - 连接到 Heroku Postgres - 服务器不支持 SSL 连接

entity-framework - Savechange 将一个索引替换为另一个索引

c# - 防止为 EF6 中的特定实体生成表

c# - 有没有办法检测一个进程是否/何时在 C# .Net 2.0 中启动另一个进程?

database - 计算给定函数依赖性的候选键

c# - 在不调用构造函数的情况下创建对象实例?

MySQL 在自己的列上有多个值

entity-framework - 将 EF Core 迁移拆分到多个项目

c# - 正则表达式,其中字符串的一部分必须是 0-100 之间的数字

c# - 从查询字符串开始时比较 EntitySQL 中的 DateTime 值