C# 实体框架核心和定义一对多和一对一关系

C# 实体框架核心和定义一对多和一对一关系,c#,entity-framework-core,ef-fluent-api,C#,Entity Framework Core,Ef Fluent Api,我已经尝试过寻找解决方案,但到目前为止我还没有成功(如果有人能给我一个答案或例子,我将不胜感激) 我的假设实体结构如下: public class ClassA { public int Id { get; set; } public string ClassName { get; set; } public ICollection<ClassB> ClassBs { get; set; } } public class ClassB { pu

我已经尝试过寻找解决方案,但到目前为止我还没有成功(如果有人能给我一个答案或例子,我将不胜感激)

我的假设实体结构如下:

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
{
公共int Id{get;set;}
公共字符串类名{get;set;}
公共ICollection类{get;set;}
}
公共B类
{
公共int Id{get;set;}
public int ParentId{get;set;}
公共类A父级{get;set;}
公共int SingleRelatedClassId{get;set;}
公共类A SingleRelatedClass{get;set;}
}
正如您所看到的,ClassA与ClassB有一对多的关系。这很好而且正确。但是,我现在需要在ClassB和ClassA(SingleRelatedClass)之间引入一对一的关系,而ClassA中没有导航属性


如何使用数据注释或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; }
}

如果有更有效或更正确的方法,请务必让我知道,但这对我来说是正确的。

这是否回答了您的问题?感谢@SvyatoslavDanyliv的链接。我已经在做那个链接建议的事情了,但结果证明我的配置和查询都错了。我已经把我的发现写进了答案。
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);
}
var result = await _context.ClassA
    .AsNoTracking()
    .Include(a => a.ClassBs)
    .ThenInclude(b => b.SingleRelatedClass)
    .Where(a => a.Id.Equals(idFilter))
    .FirstOrDefaultAsync();