我使用的是ASP.NET Core2.2和EFCore2.2以及server。
我目前正在开发一个特性,其中我有以下类:
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配置:
Foo
builder.HasOne(b => b.IntroText)
.WithOne()
.IsRequired(false);含量
内容本身只有配置。
内容可以包含大量文本,由于原因,这些内容没有直接保存在Foo表/类中。
如您所见,我正在努力确保Content没有Foo的外键/导航属性。这是因为这些属性不是Content的一部分,而且在将来,更多的类/表可以有诸如IntroText之类的东西保存在Content表中,而且我不希望Content被可空的外键/导航属性填充。
这与EF核心有可能吗?
我现在看到的错误是:
对于“Foo.IntroText”和“内容”之间的一对一关系,无法确定子/依赖方。若要标识关系的子/依赖方,请配置外键属性。如果这些导航不应该是相同关系的一部分,则在不指定反向的情况下配置它们。有关更多详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=724062。
我会接受这样一个答案,即允许数据库有一个我在代码库中看不到的关系,但我希望Content不知道任何关于Foo的事情。
非常感谢您的帮助!
发布于 2019-05-16 21:27:15
如果在Foo实体中公开了一个IntroTextId,则需要将其作为一对一关系中的FK关联:
builder.HasOne(b => b.IntroText)
.WithOne()
.HasForeignKey(b => b.IntroTextId)
.IsRequired(false);通常情况下,我不希望在实体中公开FK属性,因为这会导致引用哪个实体的两个真实来源。(Foo.IntroTextId vs. Foo.IntroText.IntroTextId)在这种情况下,您可以利用FK的影子属性:
builder.HasOne(b => b.IntroText)
.WithOne()
.HasForeignKey("IntroTextId")
.IsRequired(false);这与在EF 6中使用Map(MapKey)映射FKs而不公开属性类似(而且更直观)。
.Map(x => x.MapKey("IntroTextId"));发布于 2021-04-30 18:40:48
另一个可能的解决方案是将这两个键作为一个来处理。由于这是一对一的关系,表Foo和内容的键应该是相同的值。您可以使用Foo类中的属性(因为没有将FluentAPI指定为需求)来实现它:
class Foo
{
[Key, ForeignKey(nameof(Foo.IntroText))]
public Guid Id { get; set; }
public Content IntroText { get; set; }
}
class Content
{
public Guid Id { get; set; }
public string Text { get; set; }
}https://stackoverflow.com/questions/56171197
复制相似问题