2012-03-14 1 views
0

新しいエンティティを作成するときに、作成直後に外部キーフィールドの1つにアクセスしようとすると、オブジェクト参照例外が発生します。Entity Frameworkでエンティティを作成した後にForeignKeyフィールドにアクセスする

オブジェクト参照がオブジェクトインスタンスに設定されていません:

 Call call = new Call() 
     { 
      .... 
      StoreID = storeID, //foreign key of store 
      .... 
     } 
     db.Calls.Add(call); 
     db.SaveChanges(); 
     .... 

     // do something with store 
     call.Store.Anything(); 

これは投げる - ここでは、コードです。

call.Storeは私がストアオブジェクトにアクセスしようとしていない場合、コードは完璧に動作する任意のオブジェクト

ノートにマップされていませんので。私がユーザーをリダイレクトし、コールがゼロからロードされた場合、Storeオブジェクトにアクセスすることは問題ありません。私は

db.Entry(call).Reload(); 

を試してみました厄介なハックとして

それでも、私は作成時にストアオブジェクトがすぐにアクセスできるようにするにはどうすればよい

を助けていませんか?


モデル:

[Table("CALL_LOG")] 
public class Call 
{ 
    ..... 

    [Column("STORE_IID"), Required] 
    public int StoreID { get; set; } 

    [ForeignKey("StoreID")] 
    public virtual Store Store { get; set; } 

    ..... 
} 
+0

まだ親を確立していない場合は、子レコードの親レコードがnullになることがあります。保存する前に、コールの親になるStoreレコードと同じStoreプロパティを設定する必要があります。外部キーフィールドを外部設定する何かがある場合、再読み込みすると良いことがあります。データベースをチェックして、レコードのStoreIDが新しいレコードのCALL_LOGのNULL以外の値に設定されているかどうかを確認しましたか? – JamieSee

+0

@JamieSee彼はCallオブジェクトを作成するときにStoreIDを設定しています。それは挿入されますが、オブジェクトはコンテキストにロードされていません。 – Dismissile

答えて

2

以下は、私は信じて動作します:

db.Entry<Call>(call).Reference("Store").Load() 

これは、ストアナビゲーションプロパティをロードするためにそれを教えてくれます。

+0

これは、ありがとうございます。まだ少し汚れているようです。私の意見では、オブジェクトはdb.SaveChanges()を実行するとすぐに100%使用可能になるはずです。 – NoPyGod

+0

@ NoPyGod私は、それが仮想クラスにマークされていれば、それを試してアクセスしようとすると論理的な考えがロードされることに同意しますが、その問題はあなたがプロキシクラスのインスタンスを扱っていないということです。実際のクラスのインスタンスを扱うので、この場合、遅延ロードは実際には機能しません。 – Dismissile

1

[OK]を、今私は理にかなってより多くのコードを参照してくださいということ。 IDを格納しているので、データベースを再度ヒットしてオブジェクトを膨張させる必要があります。

Call call = new Call() 
{ 

    .... 

    StoreID = storeID, //foreign key of store 

    .... 

} 

db.Calls.Add(call); 

db.SaveChanges(); 
call = db.Calls.Single(c => c.CallId = call.CallId).Include(c => c.Store); 

.... 

// do something with store 

call.Store.Anything(); 
+0

はい、私はそれを試みました、それは同じ効果があります - まだ動作しません。とにかく使用する方が正しいですか? – NoPyGod

+0

いいえ、それは動作しません、それは同じ効果があります。ストアプロパティが設定されていません。私はどのようにStoreIDフィールドが設定されているかを表示するために投稿を更新しました。 Storeプロパティは、関連するStoreオブジェクトに自動的にリンクされる必要があります。 – NoPyGod

+0

私は全体の呼び出しのためにデータベースを打つのを避けることを望んでいました。私は上記の答えを得た。しかし、ありがとう。 – NoPyGod

0

私はあなたが権利を取得した場合:(?call = new Call()付き) 1.あなたが何らかの形でDBを使用していない新しいコール・インスタンスを作成している場合、この行でそれを追加する前に:

db.Calls.Add(call); 

2. Storeプロパティにアクセスしようとした後にNullReferenceExceptionを取得します。

これが当てはまる場合は、Store to Callクラスを初期化するctorを追加すると役立ちます。

public Call() 
{ 
... 
    this.Store = new Store(); 
} 
+0

Storeは新しいオブジェクトではなく、ForeignKeyを使用してデータベースからロードされるはずです。私はどのようにStoreIDフィールドが設定されているかを表示するために投稿を更新しました。 – NoPyGod

関連する問題