2

私はこの問題を解決しようとしていますが、このエラーに関するコンテンツを読みましたが、解決策を見つけることができませんでした。単純な製品カテゴリシナリオのエンティティフレームワークを使用して、winformsアプリケーションを構築しています。これが私のモデルのスナップショットです。 Edmx

すべての製品を取得するProductServiceクラスのコードは次のとおりです。

public static List<Product> GetAllProducts()
{
    List<Product> products = new List<Product>();
    using (var entity = new SUIMSEntities1())
    {
        products = (from p in entity.Products
                    select p).ToList();
        return products;
    }            
}

背後にある製品コードのコードは

List<Product> prods=ProductServices.GetAllProducts();
dgvProducts.DataSource = prods;

datagridviewに製品をロードしようとすると、次のエラーが表示されます。 ここに画像の説明を入力してください

問題の原因を教えてください。

編集: インクルードがトリックを行い、この特定のシナリオでは、GetAllProducts()を次のように変更しました

        public static List<Product> GetAllProducts()
        {
            using (var entity = new SUIMSEntities1())
            {
                List<Product> products = entity.Products.Include("Category").ToList();
                return products;                
            }            
        }
4

2 に答える 2

4

デフォルトでは、Entity Framework(EF)はCategoryオブジェクトセットを遅延ロードします。カテゴリオブジェクトセットは遅延ロードされるため、後で他のコードがカテゴリを参照すると、EFはセットをロードしようとします。ただし、この時点でコンテキストは破棄されているため、表示されているエラーが発生します。

あなたがする必要があるのは、コンテキストに次のようにカテゴリエンティティセットを熱心にロードするように強制することです。

public static List<Product> GetAllProducts()
{
    List<Product> products = new List<Product>();
    using (var entity = new SUIMSEntities1())
    {
        entity.Include("Category");  //force eager loading of Category
        products = (from p in entity.Products
                    select p).ToList();
        return products;
    }            
}
于 2012-08-09T23:28:42.710 に答える
2

を返しますがList<Product>、カテゴリにアクセスするとデータベースアクセスが発生するように見えます。問題は、データベースにアクセスするために必要なコンテキストをすでに破棄していることです。

于 2012-08-09T23:21:53.463 に答える