1

私のDBから選択したデータに問題があります。データをデータベースに保存するとうまくいくが、データは取得できない。 :(データベースから複数のオブジェクトを選択します。Entity Frameworkコア

モデル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; } 
    } 
} 

コンテキストが基本である DBコンテキスト:。

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

Getメソッドを:

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

私はgettin gデータをデータベースから取得し、.ThenIncludeは正常に動作しますが、単純な関連オブジェクトやオブジェクトのリストをロードしようとしています。 上記のオブジェクトリストに含まれるすべてのオブジェクトのすべての関連オブジェクトをロードしたいときに問題が発生します。これは、オブジェクトがnullを参照するときに選択ベローズがドロップするためです。

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

関連するすべてのデータと関連するデータを、1回の呼び出しでデータベースにロードするにはどうすればよいですか?

+0

ご質問はお聞きしたいかについては明らかではありませんか? – Siraj

+0

バッターの理解のために編集しました。 –

答えて

1

どちらもnew { ... }でもSelectでも有効です。Include/ThenIncludeという表現です。インクルード式は、単純なプロパティパスアクセサを表す必要があります。 Loading Related Data - 複数のレベルを含むで説明されているように、追加の子プロパティを含めるために共通パスを繰り返す必要がある場合があります。単純なプロパティも非コレクションのThenIncludeをスキップすることができ、ちょうど含むために使用することができ、そのすべての親プロパティが含ま含むので

.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) 

:あなたの例では

は、あなたがこのようなものを使用することになっていますコレクションナビゲーションプロパティの要素の追加データ。ここでは、

.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") 
+0

両方のソリューションを試してみましたが、EFは例外を返します。NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 Microsoft.EntityFrameworkCore.Query.Internal.IncludeCompiler + IncludeLoadTreeNodeBase + <_AwaitMany> d__8.MoveNext() –

+0

DB内にBオブジェクト、Cオブジェクト、Dオブジェクトが1つあります。私は問題がこれにあると思う。この状態をどうにかして骨化する必要があります。 –

+0

これは別の話です。 EFCのバグ、バージョンは何ですか? –

関連する問題