2016-05-10 6 views
0

を配置し、以下のエンティティを持って投げるSQLの子テーブルへCustomerIDのFK制約を介してリンクされ、その関係を持つ.dbmlファイルに表示されますLINQのデータコンテキストが問題私はデータ抽出のためのLINQ to SQLクラスを使用しています

intellisenseでオブジェクトのプロパティにアクセスすると、Customer.Name, Customer.Addressなどが表示されますが、リンクされたOrdersエンティティCustomer.Orders

私の問題は、私はDataContextのが唯一のCustomerエンティティを移入して処分するデータベースを照会するとき、私はエラーが破棄されたオブジェクトにアクセスできません

を投げ得るということです。オブジェクト名: '廃棄後にDataContextにアクセス '。

public IEnumerable<Customer> GetCustomer(Int32 customerID) 
     { 
      // initialise 
      Customer cust = new Customer(); 

      using (CustomerManager ctl = new CustomerManager()) 
      { 
       // get customer, this returns a single customer entity 
       // i.e. datacontext.Customers.Where(m=> m.CustomerID == customerID).FirstOrDefault(); 
       cust = ctl.SelectCustomer(customerID); 

      } 

      yield return cust; 
} 

私はすなわちCustomer_SelectResultストアドプロシージャにこれを変更しようとしていると、これは完全に正常に動作します。それは私がテーブルを使用するときです。

子テーブルがこの問題を引き起こさないようにする方法はありますか?

ありがとうございます。

+1

ただ、好奇心から、なぜあなたは、IEnumerableをを返すのですか? –

+0

はい、1人の顧客だけがエラーをスローします。 – CR41G14

答えて

1

処分する前に、すべてのデータを読み込む必要があります。解説についてはhttps://msdn.microsoft.com/en-us/library/bb399393(v=vs.110).aspx、解説についてはhttps://msdn.microsoft.com/en-us/library/bb386920(v=vs.110).aspxを参照してください。

結果を生成すると別の問題が発生し、結果が反復されたときにクエリがデータベースで実行されます。 https://blogs.msdn.microsoft.com/charlie/2007/12/10/linq-and-deferred-execution/

+0

これはMVC4.5で最近ですか?私は他のプロジェクトLinqをSQLに使用してこの問題を持っていない – CR41G14

+0

私は認識していない。しかし、コードではyield文をIEnumerableと組み合わせて使用​​しているので、コンテキストが破棄された後にクエリが実行されると思います。 –

+0

DeferredLoadingEnabled = falseを設定して問題を解決しました。 – CR41G14

0

キーワードusingは、初期化されたオブジェクトをその中に自動的に配置します。私は、GetCustomerが呼ばれた後にctlが処分されたと思います。だから、あなたはそれなしで試すことができます。指定されたidの唯一の顧客が存在する場合

CustomerManager ctl = new CustomerManager() 
yield return ctl.SelectCustomer(customerID); 
関連する問題