3

次のEFコードの最初のコードがあります。正常に動作しています。しかし、「club2.Members」の値を探すと、次のように表示されます。

「club2.Members」が「System.ObjectDisposedException」タイプの例外をスローしました。

メッセージは次のとおりです。

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

Member プロパティの値を設定していません。大丈夫。ただし、内部で例外が発生することはありません。

  1. この例外を克服する方法はありますか?
  2. この例外を削除すると、パフォーマンスが向上しますか?
  3. この例外によってプログラムの実行が終了しなかったのはなぜですか?

注: クラブ エンティティのメンバー データは必要ありません (呼び出した時点で)。その時点でクラブに追加されたメンバーはいません。必要なのは、例外を取り除くことだけです。熱心なロードを使用してデータをロードしないでください。例外を回避する方法は?

ここに画像の説明を入力

namespace LijosEF
{

public class Person
{
    public int PersonId { get; set; }
    public string PersonName { get; set; }
    public virtual ICollection<Club> Clubs { get; set; }
}

public class Club 
{
    public int ClubId { get; set; }
    public string ClubName { get; set; }
    public virtual ICollection<Person> Members { get; set; }

}




//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{

    public NerdDinners(string connString): base(connString)
    { 

    }

    protected override void OnModelCreating(DbModelBuilder modelbuilder)
    {
         //Fluent API - Plural Removal
        modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

    public DbSet<Person> Persons { get; set; }
    public DbSet<Club> Clubs { get; set; }



}
}




    static void Main(string[] args)
    {
        Database.SetInitializer<NerdDinners>(new MyInitializer());

        CreateClubs();
        CreatePersons();

    }

    public static void CreateClubs()
    {

        string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
        using (var db = new NerdDinners(connectionstring))
        {

            Club club1 = new Club();
            club1.ClubName = "club1";

            Club club2 = new Club();
            club2.ClubName = "club2";

            Club club3 = new Club();
            club3.ClubName = "club3";

            db.Clubs.Add(club1);
            db.Clubs.Add(club2);
            db.Clubs.Add(club3);

            int recordsAffected = db.SaveChanges();


        }
    }

    public static Club GetClubs(string clubName)
    {
        string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
        using (var db = new NerdDinners(connectionstring))
        {

            var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName);
            return query;
        }
    }

    public static void CreatePersons()
    {
        string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
        using (var db = new NerdDinners(connectionstring))
        {

            Club club1 = GetClubs("club1");
            Club club2 = GetClubs("club2");
            Club club3 = GetClubs("club3");

             //More code to be added (using db) to add person to context and save
        }
    }
4

2 に答える 2

8

クエリの実行後に dbcontext を破棄しているため、このエラーが発生しています。「メンバー」のデータを使用する場合は、クエリでロードします: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature- ctp5-part-6-loading-related-entities.aspx

遅延ロードが必要ない場合、つまり、クエリでロードしているデータのみがロードされる (これにより例外が排除されます) 場合は、LazyLoadingEnabled = false を設定します。ここを見てください: Entity Framework 4 でデフォルトで遅延読み込みを無効にする

于 2012-07-25T11:22:15.853 に答える
1

アプローチ 1

以下の方法は必要ありません。これは、現在のコンテキストで実行できます。あくまでもセレクトです。

GetClubs("club1");

アプローチ 2

エンティティを添付すると、問題が解決しました。

            Club club1 = GetClubs("club1");
            Club club2 = GetClubs("club2");
            Club club3 = GetClubs("club3");

            ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club1);
            ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club2);
            ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club3);


            var test = club2.Members;

Person オブジェクトの作成には必要ないため、(Club クラスの) club2.Members を参照しようとするべきではありませんでした。

Member は Club クラスの関連データです。仮想なので、遅延読み込みを行います。

別のシナリオで、Members オブジェクト (関連データ) を別のコンテキストから取得する必要がある場合は、(Club オブジェクトを提供する場所で) 熱心な読み込みに頼る必要があります。

以下も参照してください。

  1. Entity Framework: 多対多の関係でレコードが重複する

  2. System.ObjectDisposedException: ObjectContext インスタンスが破棄され、接続を必要とする操作に使用できなくなりました

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

  4. バインド中に ObjectContext インスタンスが破棄されました

于 2012-07-26T06:33:47.523 に答える