2017-01-16 1 views
1

私は今までの3つのエンティティで構成されたエンティティモデルでEntity Framework 6.1を使用していますが、Product,ProductImageおよびFileです。しかし、私のデータがデータベースに永続的に保存されている間、私はInclude()メソッドを使って熱心な読み込みを使用してデータを読み込むことにいくつかの困難を抱えています。私が使っているエンティティは以下の通りです。Entity Frameworkを使用している間にクエリが関連するデータを読み込めないのはなぜですか?

Productエンティティ:

public class Product 
{ 
    ICollection<ProductImage> images; 

    public Product() 
    { 
     images = new List<ProductImage>(); 
    } 

    public ICollection<ProductImage> Images 
    { 
     get { return images; } 
     set { images = value; } 
    } 
} 

ファイルの実体:

public class File 
{ 
    private Guid fileId; 

    public File() 
    { 
     FileId = Guid.NewGuid(); 
    } 

    public Guid FileId 
    { 
     get { return fileId; } 
     set { fileId = value; } 
    } 
} 

ProductImageエンティティ:

public class ProductImage 
{ 
    private File file; 
    private Product product; 

    private ProductImage() 
    { 
     file = new File(); 
     product = new Product(); 
    } 

    public ProductImage(Product product, File file) 
    { 
     this.product = product; 
     this.file = file; 
    } 

    [Key] 
    [Column(Order = 0)] 
    [ForeignKey("Product")] 
    public int ProductId 
    { 
     get { return product.ProductId; } 
     set { product.ProductId = value; } 
    } 

    [Key] 
    [Column(Order = 1)] 
    [ForeignKey("File")] 
    public Guid FileId 
    { 
     get { return file.FileId; } 
     set { file.FileId = value; } 
    } 

    public File File 
    { 
     get { return file; } 
     set { file = value; } 
    } 

    [InverseProperty("Images")] 
    public Product Product 
    { 
     get { return product; } 
     set { product = value; } 
    }  
} 

私はその後、Productをロードするには、以下の機能を利用しようとすると、そのProductImageと関連するFile ing:

static Product LoadProduct(int productId) 
{ 
    using (var db = new ProductCatalogueDbContext()) 
    { 
     var query = from product in db.Products 
         .Include(p => p.Images.Select(i => i.File)) 
         .Where(p => p.ProductId == productId)               
         select product; 
     return query.SingleOrDefault(); 
    } 
} 

私が使用しているクエリに問題はありますか?

+0

どのようなエラーがありますか? –

+0

エラーはありません。 Fileのデータはロードされません。これには、Fileクラスのプロパティであったファイルの名前やサイズなどが含まれます。 –

+0

遅延ロードの恩恵を受けるためには、ナビゲーションプロパティを仮想にする必要があります。たぶんこれは副作用としてあなたの問題を解決します。 – musium

答えて

1

はい、あなたのコードに問題がある - あなたが自由に「ドット表記」でLINQクエリのSQLに似たスタイルを混合している - あなたはそのようにそれを行うことはできません....

私は個人的には「ドット表記法」を好む - その場合には、あなたがすべての部品あなたのLINQクエリのためにその表記を使用する必要があります。

var query = db.Products 
       .Include(p => p.Images.Select(i => i.File)) 
       .Where(p => p.ProductId == productId) 
       .Select(p => p); 

として、私の知る、Includeはありません。 "SQLのような"同等なので、あなたはSQLのような構文と適切に "結合"するか、単に "ドット記法"を使用するか...

+0

ミキシングは問題にならないはずです。クエリが正しければうまくいくはずです –

+0

実際、私はそれについてかなり考えていませんでした。私はSQLのようなスタイルを好むのが普通ですが、ドット記法を使用していたSOの一部の記事を読んでいました。これは、IncludeのMSDNリファレンスにつながりました。私はそれがどんな場合でも問題だとは思わない。 –

0

データが読み込まれなかった理由を完全に理解していませんが、私は原因を部分的に特定することができました。 ProductImageのCtor内のFileオブジェクトのインスタンス化とFileプロパティによって返されていたファイルフィールドへの参照の割り当てが問題を引き起こしていました。

ロードするプロパティが実際にnullを返さない前に、EFデータのロードに関する問題が発生しました。この問題は、遅延読み込みエンティティに関連して発生しました。私が推測できることは、間違いかもしれませんが、プロパティがnullを返さない限り、EFはプロパティに関連するデータベースからデータを実際にロードしないことになりますか?

関連する問題