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();
如果有更有效或更正确的方法来做到这一点,请务必告诉我,但这对我来说是正确的。
我已经尝试为此寻找解决方案,但到目前为止我还没有成功(如果有人可以指出答案或示例,我将非常感激)。
我有一个假设的实体结构如下:
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();
如果有更有效或更正确的方法来做到这一点,请务必告诉我,但这对我来说是正确的。