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; 

PaleyPublication如下(和你的一样):

 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; 

并在OnModelCreatingDbContext 中的模型使用以下配置:

   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 核心。两个实体(表)之间的多个一对一或零关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate5.x表与表之间的关系操作代码实现

MyBatis之基于XML的表之间映射

使用 EF4.1 Fluent API 将具有导航属性的实体拆分为两个表

2个表之间的关系 - 一对多和一对一(可空)EF代码优先

使用 EF 核心将多个关系数据添加到 SQL Server

一对一或零对一实体框架代码优先 Fluent Api