2012-02-13 8 views
14

エンティティを追加した直後に、必要に応じて、新しく追加されたエンティティのプロパティが遅延ロードされないという問題があります。コードファーストエンティティが遅延ロードプロパティを追加しない

public class User 
{ 
    public int Id { get; set; } 

    public virtual JobRole JobRole { get; set; } 
    public int JobRoleId { get; set; } 

    public string Name { get; set; } 
} 

は、私は、新しいユーザーを追加します:私は、仮想JobRoleプロパティを持つUserエンティティを持っている

:たとえば

public User Add(User user) 
{ 
    var addedUser = _myContext.Users.Add(user); 
    myContext.SaveChanges(); 
    return addedUser; 
} 

新しいユーザーに返された参照Razorビューに渡され、JobRole(JobRole.Nameなど)を表示しようとします。ユーザーがビューに渡される時点で、次のようになります。

  • JobRoleIdが整数値に正しく設定されています。
  • JobRole = nullを

ビューで使用されるとき、私はその後、JobRoleは怠惰なロードされるのを期待するだろうが、それがnull参照の例外で、結果ではありません。

これは予期された動作ですか、または新しく追加されたエンティティにプロパティの読み込みを遅延させる方法がありますか?

ありがとうございました。

環境: エンティティフレームワーク4.2コードファーストを使用する。 遅延読み込みが有効になっています。

+0

私はこの問題を持っていた答えが正解です。しかし、私のコードはデータベースを最初に使用しています。だから私はあなたのタイトルを編集することをお勧めします。 –

答えて

20

ためですDbSet.Addメソッドはと同じオブジェクトを引数として渡します。この場合、プロキシインスタンスではないため、遅延読み込みは使用できません。

あなたはプロキシインスタンスを返し、その後、DbContextを通してそれを永続化する前に、そのプロパティを割り当てますDbSet.Create方法を、使用してDbSet.Addに渡されていますUserオブジェクトを作成する必要があります。ここで

は例です:

public User Add(User user) 
{ 
    var newUser = _myContext.Users.Create(); 

    // Copy the property values from 'user' to 'newUser' e.g. 
    // newUser.Name = user.Name 

    _myContext.Users.Add(newUser); 
    myContext.SaveChanges(); 

    return newUser; 
} 
+7

パーフェクト。私の問題を解決しました - 多くのありがとうございます。ユーザープロパティをコピーするには、SaveChanges()の前に行を追加しました。_myContext.Entry(newUser).CurrentValues.SetValues(user);うまく動作するようです。 – Appetere

+0

@スティーブそれはさらに良いです。私は私が助けることができてうれしいです:) –

1

あなたが最初のものは熱心なロードを強制され、二つのことを試すことができます。

context.ContextOptions.LazyLoadingEnabled = false; 

これが機能しない場合、あなたはこれを使用してプロパティをロードすることができます:http://msdn.microsoft.com/en-us/library/dd382880.aspx

+0

私の質問に答える時間をとってくれてありがとう。しかし、遅延ロードをオフにしてもすべての負荷がかかりすぎるわけではありません。アイテムを取得するときにのみ適用するもので、追加しないものには「include」ステートメントが必要です。私はプロパティを手動で読み込むことができますが、なぜこれが自動的に起こらないのかを実際に理解しようとしています。 – Appetere

+0

いつでも。どういたしまして。 =) –

+0

おそらく、あなたがincludeメソッドでロードを強制していないからです。コンテキストが遅延ロードされている場合は、エンティティの属性であるため、クラスの関係プロパティがロードされますが、実際には関係は存在しません。 –

関連する問題