我正在将 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了解更多详情。
我会接受允许数据库具有我在代码库中看不到的关系的答案,但我更希望 Content
对 Foo
一无所知>
非常感谢您的帮助!
最佳答案
如果您在 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/