【问题标题】:Zero-or-one relationship in EF CoreEF Core 中的零或一关系
【发布时间】:2020-12-13 10:48:42
【问题描述】:

我在 EF Core 中有一个零或一关系的特殊场景,默认情况下无法轻松建模(如所述,例如,EF Core One to One or Zero Relationship)。

我有多个实体与“匹配”实体具有 0-1 关系。多个实例可以引用同一个“匹配”实体(这就是为什么我不能将外键放入“匹配”表的原因,这似乎是建模 0-1 关系的推荐方式)。

如何定义从其中一个实体到 0-1“匹配”实体的关系?我必须创建一个 Match().HasMany(someKindOfBaseClassOfEntities) 吗?有没有更好的办法?

【问题讨论】:

  • 您无法配置从匹配到匹配“所有者”的导航,但您可以通过HasOne 将每个所有者配置为拥有一个Match
  • 但是“HasOne”,至少据我所知,将创建一个非可选的 1:1 关系。我也有没有相应“匹配”的“所有者”,所以我需要 1:0-1 的关系。

标签: c# entity-framework entity-framework-core ef-core-5.0


【解决方案1】:

您可以使用 HasOne 进行配置,它允许 1:0..1 的关系。只展示一种方法,无需重复太多映射代码:

类:

class Match
{
    public int ID { get; set; }
    public string Name { get; set; }
}

abstract class HasMatchBase
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int? MatchID { get; set; }
    public Match Match { get; set; }
}

class A : HasMatchBase
{
    public string Code { get; set; } // Just an example
}

class B : HasMatchBase { }

映射配置:

abstract class HasMatchBaseConfig<T> : IEntityTypeConfiguration<T>
    where T : HasMatchBase
{
    public void Configure(EntityTypeBuilder<T> builder)
    {
        builder.Property(b => b.Name).HasMaxLength(200);
        builder.HasOne(b => b.Match).WithOne().HasForeignKey<T>(b => b.MatchID);

        ConfigureMatchOwner(builder);
    }
    
    public abstract void ConfigureMatchOwner(EntityTypeBuilder<T> builder);
}

class AConfig : HasMatchBaseConfig<A> 
{ 
    public override void ConfigureMatchOwner(EntityTypeBuilder<A> builder)
    {
        builder.Property(a => a.Code).HasColumnType("CHAR").HasMaxLength(3);
        ... // Further A-specific mapping
    }
}

class BConfig : HasMatchBaseConfig<B>
{
    public override void ConfigureMatchOwner(EntityTypeBuilder<B> builder)
    {
        ... // B-specific mapping. 
    }
}

HasMatchBase.MatchID 的类型决定了关联是必需的还是可选的。在这种情况下,它是一个可以为空的 int,将关联转换为 Match 是可选的。

【讨论】:

    猜你喜欢
    • 2019-07-25
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-06-27
    • 1970-01-01
    • 2013-01-20
    • 2021-07-21
    相关资源
    最近更新 更多