web-dev-qa-db-ja.com

ObjectContextインスタンスは破棄され、接続を必要とする操作には使用できなくなりました。参照表

2つのテーブルCustomersCountryを使用し、Entity Framework with vs 2012を使用しています

enter image description here

そして、モデルクラス

 using System;
 using System.Collections.Generic;

 public partial class Customer
 {
     public int Id { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string Address { get; set; }
     public string Email { get; set; }
     public string Phone { get; set; }
     public Nullable<int> CountrryId { get; set; }
     public string Note { get; set; }

     public virtual Country Country { get; set; }
 }

国名を持つすべての顧客を取得するための選択クエリを作成しようとしています。しかし、常に以下のエラーメッセージが表示されます。

enter image description here

27
Ragesh S

データコンテキストが破棄された後、関連付けプロパティCountryにアクセスしようとしています。 Entity Frameworkは、デフォルトでは、 関連付けプロパティを遅延的にロードします 。つまり、初めて関連付けプロパティにアクセスしようとすると、データベースに再度アクセスします。このデータベースへの旅行を行うには、Entity Frameworkはデータコンテキストを使用する必要があります。あなたの場合、残念ながらコードのこの時点で破棄されたjQGridDemoEntities db = new jQGridDemoEntities()によって作成されたデータコンテキストを使用しようとしています。 sing block を終了したため、データコンテキストは破棄されました。

この問題を回避するには、次の3つのオプションがあります。

  • データコンテキストがまだ生きているときに関連付けプロパティにアクセスします。より具体的には、関連付けプロパティにアクセスするコードをusingブロックに移動します

  • 指定した最初のリンクで説明されているように、関連付けプロパティを積極的に読み込みます

    customers = db.Customers.Include(c => c.Country).ToList()

  • データコンテキストがまだ生きている間に、データベースから返すものを明示的に選択します。そして、その情報を使用して、戻り値のjsonオブジェクトを構築します。

    customers = db.Customers.Select(c => new
    {
        c.Id,
        c.FirstName,
        c.LastName,
        c.Address,
        c.Email,
        c.Phone,
        CountryName = c.Country.Name,
        c.Note
    };
    
39
Steven Wexler

遅延読み込みが有効になっています。したがって、参照プロパティをロードしようとすると、ObjectContextはusingブロックの直後に破棄されるため、実行する方法はありません。

修正するには2つの方法があります。

_//1. Tell EF to load Country property immediately.
using(var db = new jQGridEntities())
{
    customers = db.Customers.Include(c => c.Country).ToList();
}

//2. Put return inside using block.
using(var db = new jQGridEntities())
{
    customers = db.Customers.ToList();
    return Json(/*your code*/);
}
_

遅延読み込みを無効にすることもできますが、その場合はNullReferenceExceptionを取得します。これは.Include(c => c.Country)を使用して修正することもできます。

8
lorond

usingブロックでデータベースを破棄しています

コードを外部ではなくusingブロックに入れます。

usingブロック要素を使用する場合、using(var element)でブロックを使用するときに破棄される

1
TC Alper Tokcan

viewBagを使用して、もう1つのソリューションがあります

using(var db = new jQGridEntities())
{
    var customers = db.Customers.Where(c=>c.Country!=null).ToList();
    ViewBag.customerlist= customers;
}
0
Felichino