Entity Framework 核心和定义一对多和一对一的关系

Entity Framework Core and defining a one-to-many and one-to-one relationship

我已经尝试为此寻找解决方案,但到目前为止我还没有成功(如果有人可以指出答案或示例,我将非常感激)。

我有一个假设的实体结构如下:

public class ClassA
{
    public int Id { get; set; }

    public string ClassName { get; set; }

    public ICollection<ClassB> ClassBs { get; set; }
}

public class ClassB 
{
    public int Id { get; set; }

    public int ParentId { get; set; }
    public ClassA Parent { get; set; }

    public int SingleRelatedClassId { get; set; }
    public ClassA SingleRelatedClass { get; set; }
}

如您所见,ClassA 与 ClassB 具有一对多关系。这工作得很好而且正确。但是,我现在需要在 ClassA 中引入没有导航 属性 的 ClassB 和 ClassA (SingleRelatedClass) 之间的一对一关系。

如何使用数据注释或 Fluent API 实现这些关系?

事实证明我的实体(大部分)设置正确,但我的配置和实际查询不正确。以下是对我有用的。

实体:

public class ClassA
{
    public int Id { get; set; }
    public string ClassName { get; set; }

    public virtual ICollection<ClassB> ClassBs { get; set; }
}

public class ClassB 
{
    public int Id { get; set; }

    public int ParentId { get; set; }
    public virtual ClassA Parent { get; set; }

    public int SingleRelatedClassId { get; set; }
    public virtual ClassA SingleRelatedClass { get; set; }
}

配置(仅包含相关信息):

public void Configurate(EntityTypeBuilder<ClassB> builder)
{
    // One-to-many
    builder
        .HasOne(b => b.Parent)
        .WithMany(a => a.ClassBs)
        .HasForeignKey(b => b.ParentId);

    // One-to-one (without navigation property)
    builder
        .HasOne(b => b.SingleRelatedClass)
        .WithOne()
        .HasForeignKey<ClassB>(b => b.SingleRelatedClassId);
}

查询(单个项目 select 示例,使用 eager loading):

var result = await _context.ClassA
    .AsNoTracking()
    .Include(a => a.ClassBs)
    .ThenInclude(b => b.SingleRelatedClass)
    .Where(a => a.Id.Equals(idFilter))
    .FirstOrDefaultAsync();

如果有更有效或更正确的方法来做到这一点,请务必告诉我,但这对我来说是正确的。