EF 核心。两个实体(表)之间的多个一对一或零关系
Posted
技术标签:
【中文标题】EF 核心。两个实体(表)之间的多个一对一或零关系【英文标题】:EF Core. Multiple One-to-One-or-Zero relationships between two entities (tables) 【发布时间】:2022-01-21 07:55:15 【问题描述】:我设计了三个具有导航属性的实体(代码优先的方法,省略了不必要的属性):
图像(表示数据库中的图像信息):
public class Image
public long Id get; init;
public long? PlayerId get; set;
public Player Player get; set;
public long? PublicationId get; set;
public Publication Publication get; set;
出版物(某些领域实体):
public class Publication
public long Id get; init;
public long? ImageTitleId get; set;
public Image ImageTitle get; set;
public long? ImageBackgroundId get; set;
public Image ImageBackground get; set;
玩家(某些域实体):
public class Player
public long Id get; init;
public long? ImageProfileId get; set;
public Image ImageProfile get; set;
public long? ImageLogoId get; set;
public Image ImageLogo get; set;
业务规则是:
-
图像在所有情况下都是依赖实体
出版物/播放器是这些关系中的主要实体
出版物/播放器可以有或没有相关图像(一对一或零)
对我来说,这里的困难是两个实体之间的多重关系(因此是数据库中的表)(标题图像、背景图像等)。
EF 无法自动检测主体/依赖实体,我不知道在这种情况下如何配置 Fluent API。
【问题讨论】:
这将帮助我用一个词来澄清您真正想要什么或在创建迁移时遇到任何问题? 【参考方案1】:我认为您错过了Image
Entity 中的一些属性。
我将图像模型更改如下:
public class Image
public long Id get; init;
public long? ImageProfilePlayerId get; set;
public Player ImageProfilePlayer get; set;
public long? ImageLogoPlayerId get; set;
public Player ImageLogoPlayer get; set;
public long? ImageTitlePublicationId get; set;
public Publication ImageTitlePublication get; set;
public long? ImageBackgroundId get; set;
public Publication ImageBackground get; set;
和Paley
和Publication
如下(和你的一样):
public class Publication
public long Id get; init;
public long? ImageTitleId get; set;
public Image ImageTitle get; set;
public long? ImageBackgroundId get; set;
public Image ImageBackground get; set;
public class Player
public long Id get; init;
public long? ImageProfileId get; set;
public Image ImageProfile get; set;
public long? ImageLogoId get; set;
public Image ImageLogo get; set;
并在OnModelCreating
中DbContext
中的模型使用以下配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity<Image>(e =>
e.HasOne(x => x.ImageProfilePlayer).WithOne(x => x.ImageProfile).HasForeignKey<Player>(x => x.ImageProfileId).IsRequired(false);
e.HasOne(x => x.ImageLogoPlayer).WithOne(x => x.ImageLogo).HasForeignKey<Player>(x => x.ImageLogoId).IsRequired(false);
e.HasOne(x => x.ImageTitlePublication).WithOne(x => x.ImageTitle).HasForeignKey<Publication>(x => x.ImageTitleId).IsRequired(false);
e.HasOne(x => x.ImageBackground).WithOne(x => x.ImageBackground).HasForeignKey<Publication>(x => x.ImageBackgroundId).IsRequired(false);
);
结果是:
【讨论】:
以上是关于EF 核心。两个实体(表)之间的多个一对一或零关系的主要内容,如果未能解决你的问题,请参考以下文章