2012-06-14 13 views
5

私はルックアップテーブルとデータテーブルをデータベースに持っています。私は例のために性別と人を使用します。Entity Frameworkコード保存後の最初の読み込み遅延がありません

Id   Code 
1   Male 
2   Female 

と人テーブルがそうのようになります:

public class Gender 
{ 
    public int Id {get;set;} 
    public string Code {get;set;} 
} 

public class Person 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public int GenderId {get;set;} 

    public virtual Gender {get;set;} 
} 

Id   Name    GenderId 
1   Bob    1 
2   Jane    2 

私が最初にそうようなEFコードで両方のテーブルをモデル化してきましたそれでは、そのように男女のテーブルに見えるとしましょう

DBに既に存在する人物を読むと、問題なくGender.Codeにアクセスできます。私がこれをすると:

var person = new Person 
      { 
       Name = "Bob", 
       GenderId = 1, 
      }; 

context.People.Add(person); 
context.SaveChanges(); 

var code = person.Gender.Code; 

これは正しく保存されますが、最後の行では性別がnullのため失敗します。私は新しいコンテキストを開いて保存されたエンティティを読み込むと、最後の行が正常に動作します。あたかもDBからエンティティをロードしたかのように、セーブ後にジェンダーに直接アクセスできる方法はありますか?

+0

最後の文は未完成である、あなたはそれを修正するだろうか? –

+0

申し訳ありませんが、最初に保存しませんでした。ページに戻ったときに、すべてを読み込んではいけません。 – VARAK

答えて

8

new Person()を使用すると、それを取得する方法がわからないPOCOオブジェクトが作成されます。Genderプロパティ怠惰なローディング作業を行うには、proxiesが必要です。

あなたはDbSet.Create()とプロキシとしてあなたの人物を作成することができます。

var person = context.People.Create(); 
person.Name = "Bob"; 
person.GenderId = 1; 

context.People.Add(person); 
context.SaveChanges(); 
+0

ありがとうございます!最初のコードはうまくいった。 2番目の方が好ましいと思われますが、うまくいきませんでした。遅延読み込みを有効にしていない人のキャッシュされたバージョンを吐き出すだけのようです。 – VARAK

+0

ええ、 'Find()'はプロキシを返しません... 'context.People.Single(p => p.Id == person.Id)'で試すことができますか? – nemesv

+0

'Single 'も動作しません。しかし、 'Find'や' Single'の前に 'context.People.Load();'を呼び出すと、それは動作しますが、コンテキストにコレクションがリロードされます。私は 'Create'を使ってプロキシを生成する必要があります。私の答えの 'Find'関連部分を削除しました。 – nemesv

関連する問題