2012-05-10 19 views
1

エンティティと遅延読み込み、およびその他の質問についてはここで読んだことがありますが、私の人生にとってはこれができません。ここではDBのための私のSQLです:C#エンティティフレームワークレイジーロードがロードされていない

CREATE TABLE corporations(
corporationID bigint PRIMARY KEY 
); 

CREATE TABLE Character(
personID bigint PRIMARY KEY, 
corporationID int NOT NULL, 
FOREIGN KEY (corporationID) REFERENCES corporations(corporationID) 
); 

そして、それを得るために、エンティティコード(* 元から編集、まだ*を破ら):

DBEntities context = new DBEntities(); 
public Character Character_GetByID(long CharacterID) 
     { 
      context.ContextOptions.LazyLoadingEnabled = true; 
      Character character = context.Characters.Where(c => c.CharacterID == CharacterID).FirstOrDefault();  
      return character; 
     } 

だから、私の理解から、このと私は行けるはずです

Character char = Character_GetByID(characterID); 
Corporation corp = char.Corporation; 

"char.Corporation"オブジェクトが存在し、Entityはfor eign key。しかし、上記のコードを実行すると、 "corp"は必ずNULLとして返されます(関連する企業がDBにあることを確実に知っていても)。

ことの一つは、私は通知が自動生成されたエンティティCharacterオブジェクトで、それが機能を持っているということですやった:私は遅延読み込みとそれを前提となるので、奇妙に思える

public virtual Corporation Corporation 
     { 
      get { return _corporation; } 
      set 
      { 
       if (!ReferenceEquals(_corporation, value)) 
       { 
        var previousValue = _corporation; 
        _corporation = value; 
        FixupCorporation(previousValue); 
       } 
      } 
     } 

「取得」機能だろう「もしnullなら、データベースから企業を得ようとする」のようなものになります。どんな考えも高く評価されます。

*設定方法遅延読み込みのための* 要求EDIT:私のContextクラスで

、私は

this.ContextOptions.LazyLoadingEnabled = true; 

を持っており、すべてのコンストラクタのために、あなたは最初のC#から見ることができるように上記のように関数を照会する直前に、関数自体にtrueを設定しようとしました。

+0

、usingステートメントを削除し、あなたが遅延ロードを設定したんどのようにペーストしてもらえますか? – ivowiblo

+0

a。インクルード(x => x.Corporation)を使用します。 – Greens

+0

@ivowiblo:私はLazyLoadingの設定で行ったことを示す編集を追加しましたが、設定が他に分かっていれば、私はそれについてはわかりません。 – Jordan

答えて

3

遅延ロードオブジェクトコンテキスト(あなたのケースでDBEntitiesクラスのインスタンス)によって提供される機能です。したがって、エンティティオブジェクトがいくつかのDBEntitiesインスタンスにアタッチされている場合にのみ動作します。 Character_GetByIDメソッドが完了すると、コンテキストが破棄され、エンティティはデタッチされ、遅延ロード要求は実行できません。

+0

私は先に進み、 "using(var context = new DBEntities())"を取り除き、クラス全体でプライベート変数を設定することで置き換えました。(メソッドが終了するときには処分されません)残念ながら、それでもまだ動作していません... – Jordan

+0

すべて固定!コンテキストは何とか処理されていましたが、動作しています。助けてくれてありがとう! – Jordan

+0

しかし、あなたはまだどこかであなたのコンテキストを処分しているのですか?あなたは悪い時を過ごすつもりだから。 –

0

a。インクルード(x => x.Corporation);

関連するデータを読み込むための情報については、

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

はい、私はそれを試して、それは働いたが、これは、このデータが常にロードされて欲しくないので、これは貧しい回避策です(理由がこれは多くのエンティティオブジェクト何も動作していないし、非常に大きなデータセットを持っているものもあります。ほとんど使用されないためロードする必要はありません) – Jordan

+0

@Greens、それは怠け者ではなく、熱心な負荷です。 – Dennis

1

あなたが使用している場合、このdbcontextはすぐに配置されているよう

using (var context = new DBEntities()) 
{ 
    ... 
}//context is disposed here... lazy loading is not possible 
関連する問題