2016-11-16 15 views
0

したがって、2つのテーブルを相互に関連付けることを試みています。私は製品テーブルとイメージテーブルを持っています。私は製品オブジェクトに画像のコレクションを持ち、画像オブジェクト/テーブルに製品IDを持っていますが、製品オブジェクトを取得すると画像コレクションは空です。エンティティフレームワークが関連するオブジェクトを返さない

デバッグ時に、製品オブジェクトが情報をプルする前にコンテキスト要素を検査すると、コンテキスト要素にイメージがロードされ、次に製品に割り当てられます。したがって、私は手動でコンテキスト要素を検査し、それから画像を検索するときにのみ機能します。

製品

public class Product 
    { 
     public int Id { get; set; } 
     public string FriendlyUrl { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public double? Price { get; set; } 
     public double? Weight { get; set; } 
     public int? Stock { get; set; } 
     public virtual ICollection<Image> Images { get; set; } 
    } 

画像

public class Image 
    { 
     public int Id { get; set; } 
     public int ProductId { get; set; } 
     public string FileName { get; set; } 
    } 

DBContext

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

     } 

     public DbSet<Product> Products { get; set; } 
     public DbSet<Image> Images { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Product>().HasMany<Image>(s => s.Images); 
     } 
    } 

データアクセス

public Product GetById(string id) 
     { 
      Product product = _context.Products.FirstOrDefault(p => p.FriendlyUrl == id); 
      return product; 
     } 
+3

'_context.Products.Include(X => x.Images).FirstOrDefault(...' –

+0

は 'modelBuilder.Conventionsを使用してみてください。();を削除します。 – Perdido

答えて

1

あなたはあなたのケース内の画像、関連するエンティティをロードする必要があります。

データアクセス

public Product GetById(string id) 
{ 
    Product product = _context.Products.include(p => p.Images) 
           .FirstOrDefault(p => p.FriendlyUrl == id); 
    return product; 
} 

はここに関連するエンティティをロードについて詳しく読む:https://msdn.microsoft.com/en-us/library/jj574232

をまた、あなたが処分したいですコンテキストをできるだけ早く、メモリリークを避けるために、ファクトリを使用するか、コンテキストが必要な場所でインスタンス化されるようにします。

データアクセス

public Product GetById(string id) 
{ 
    using(var context = new TheContext()) 
    { 
     product = context.Products.include(p => p.Images) 
         .FirstOrDefault(p => p.FriendlyUrl == id); 
     return product; 
    } 
} 

フィールド変数に生きているのコンテキストを保管しないでください。

ここ寿命について詳しく読む:https://msdn.microsoft.com/en-us/data/jj729737

0

これはEF遅延ローディング機能によるものです。それはオフになっているようです。 意味:ロードするものを明示的に指定する必要があります。それがオンになっていた場合、それは最初

にアクセスしていますとき、コレクションがロードされるだろうあなたはここに

https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

または

http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx

または

Entity Framework Code First Lazy Loadingを、それについての詳細を読むことができます

関連する問題