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