首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心2-只有一个导航属性/关系知识的关系?

EF核心2-只有一个导航属性/关系知识的关系?
EN

Stack Overflow用户
提问于 2019-05-16 14:44:24
回答 2查看 2.4K关注 0票数 3

我使用的是ASP.NET Core2.2和EFCore2.2以及server。

我目前正在开发一个特性,其中我有以下类:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的事情。

非常感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 21:27:15

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

代码语言:javascript
复制
builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey(b => b.IntroTextId)
    .IsRequired(false);

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

代码语言:javascript
复制
builder.HasOne(b => b.IntroText)
    .WithOne()
    .HasForeignKey("IntroTextId")
    .IsRequired(false);

这与在EF 6中使用Map(MapKey)映射FKs而不公开属性类似(而且更直观)。

代码语言:javascript
复制
.Map(x => x.MapKey("IntroTextId"));
票数 3
EN

Stack Overflow用户

发布于 2021-04-30 18:40:48

另一个可能的解决方案是将这两个键作为一个来处理。由于这是一对一的关系,表Foo和内容的键应该是相同的值。您可以使用Foo类中的属性(因为没有将FluentAPI指定为需求)来实现它:

代码语言:javascript
复制
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; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56171197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档