gpt4 book ai didi

.net - 从数据库 Entity Framework Core 中选择多层对象

转载 作者:搜寻专家 更新时间:2023-10-30 23:32:32 25 4
gpt4 key购买 nike

我在从我的数据库中选择数据时遇到问题。将数据放入数据库工作正常,但获取数据却不行。 :(

模型包括 10 个类。一个类包括另一个类,但只有一种方式。型号:

namespace MyNameSpace
{
public class A
{
public long Id { get; set; }
public B B { get; set; }
public C C { get; set; }
public D D { get; set; }
public string Something { get; set; }
}
public class B
{
public long Id { get; set; }
public List<E> ListE { get; set; }
public List<F> ListF { get; set; }
}
public class C
{
public long Id { get; set; }
public G G { get; set; }
public J J { get; set; }
}
public class D
{
public long Id { get; set; }
public string Something { get; set; }
}
public class E
{
public long Id { get; set; }
public G G { get; set; }
public string Something { get; set; }
}
public class F
{
public long Id { get; set; }
public G G { get; set; }
public H H { get; set; }
public I I { get; set; }
public string Something { get; set; }
}
public class G
{
public long Id { get; set; }
public string Something { get; set; }
}
public class H
{
public long Id { get; set; }
public string Something { get; set; }
}
public class I
{
public long Id { get; set; }
public string Something { get; set; }
}
public class J
{
public long Id { get; set; }
public string Something { get; set; }
}
}

数据库的上下文是基本的。数据库上下文:

public class MyDBContext : DbContext
{
public MyDBContext(DbContextOptions<MyDBContext> options) : base(options)
{ }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<A>();
modelBuilder.Entity<B>();
modelBuilder.Entity<C>();
modelBuilder.Entity<D>();
modelBuilder.Entity<E>();
modelBuilder.Entity<F>();
modelBuilder.Entity<G>();
modelBuilder.Entity<H>();
modelBuilder.Entity<I>();
modelBuilder.Entity<J>();
}

public DbSet<A> Aset { get; set; }
public DbSet<B> Bset { get; set; }
public DbSet<C> Cset { get; set; }
public DbSet<D> Dset { get; set; }
public DbSet<E> Eset { get; set; }
public DbSet<F> Fset { get; set; }
public DbSet<G> Gset { get; set; }
public DbSet<H> Hset { get; set; }
public DbSet<I> Iset { get; set; }
public DbSet<J> Jset { get; set; }
}

获取方法:

public class DBConnections
{
private readonly MyDBContext _context;

public DBConnections(MyDBContext context)
{
_context = context;
}

public List<A> GetA()
{
return _context.Aset.Select(index => index)
.Include(i => i.B)
.ThenInclude(j => j.ListE
.Select(k => k.G))
.Include(i => i.B)
.ThenInclude(j => j.ListF
.Select(k => new {
k.G,
k.H,
k.I
}))
.Include(i => i.C)
.ThenInclude(i => new {
i.G,
i.J
})
.Include(i => i.D)
.ToList();
}
}

我正在使用简单的方法从数据库中获取数据,并且 .ThenInclude 在我尝试加载简单的相关对象或对象列表时工作正常。当我想加载提到的对象列表中包含的每个对象的所有相关对象时,就会出现问题,因为当对象引用 null 时,选择波纹管会下降。

.Include(i => i.B)
.ThenInclude(j => j.ListF
.Select(k => new {
k.G,
k.H,
k.I
}

如何一次调用数据库加载所有相关数据和子对象的相关数据?

最佳答案

new { ... }Select 都不是有效的 Include/ThenInclude 表达式。 include 表达式应该代表一个简单的属性路径访问器。这可能需要重复公共(public)路径以包含其他子属性,如 Loading Related Data 中所述。 - 包括多个级别

在你的例子中,你应该使用这样的东西:

.Include(a => a.B)
.ThenInclude(b => b.ListF)
.ThenInclude(f => f.G)
.Include(a => a.B)
.ThenInclude(b => b.ListF)
.ThenInclude(f => f.H)
.Include(a => a.B)
.ThenInclude(b => b.ListF)
.ThenInclude(f => f.I)

由于包含一个简单属性也包含它的所有父属性,因此可以跳过非集合的 ThenInclude 并且可以仅用于包含集合导航属性元素的附加数据。所以上面可以缩短为:

.Include(a => a.B.ListF)
.ThenInclude(f => f.G)
.Include(a => a.B.ListF)
.ThenInclude(f => f.H)
.Include(a => a.B.ListF)
.ThenInclude(f => f.I)

为了更好地理解它,这里是字符串 Include 等价物:

.Include("B.ListF.G")
.Include("B.ListF.H")
.Include("B.ListF.I")

关于.net - 从数据库 Entity Framework Core 中选择多层对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47449981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com