【问题标题】:Entity Framework Core and defining a one-to-many and one-to-one relationshipEntity Framework Core 和定义一对多和一对一的关系
【发布时间】:2020-12-04 07:48:34
【问题描述】:

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

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

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 是一对多的关系。这运作良好且正确。但是,我现在需要在 ClassB 和 ClassA 之间引入一对一的关系(SingleRelatedClass),而 ClassA 中没有导航属性。

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

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/49070328/…
  • 感谢@SvyatoslavDanyliv 提供链接。我已经按照该链接的建议进行操作,但事实证明我的配置和查询都错了。我已将我的发现放入答案中。

标签: c# entity-framework-core ef-fluent-api


【解决方案1】:

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

实体:

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);
}

查询(单项选择示例,使用eager loading):

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

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

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2019-08-07
    • 1970-01-01
    • 2021-09-25
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多