0

私のコントローラーアクションで、新しい画像をデータベースに追加しようとしています。イメージは、ユーザーに関連付けられているデバイスに関連付けられている必要があります。

だから私は私のエンティティクラスを持っています:

public class Image
{
   public int Id { get; set; }
   public string Url { get; set; }

   [Required]
   public virtual Device { get; set; }
}

public class Device
{
   public int Id { get; set; }
   public string Name { get; set; }

   [Required]
   public virtual User { get; set; }
}

public class User
{
   public int Id { get; set; }
   public string Login{ get; set; }
   public virtual ICollection<Device> Devices { get; set; }

   [Required]
   [DataType(DataType.EmailAddress)]
   public virtual string Email{ get; set; }
}

今、次のような新しい画像を追加しようとしているとき:

var image = new Image(); 
image.Device = Db.DbSet<Device>().Find(1); 
Db.DbSet<Image>().Add(image); 
Db.DbSet<Image>().SaveChanges();

問題は、これを使用しFindて既存のデバイスを (ユーザーとすべてのプロパティを正しく設定して) 使用すると、デバイスに正しく入力されたユーザー プロパティが取得されないことです。遅延読み込みがうまくいかなかったようです。オブジェクトのインスタンスがありますが、Userその id は 0 に設定されており、他のすべてのフィールドはデフォルト値に設定されています。

私はすべてのナビゲーション プロパティを仮想として設定しています。また、遅延読み込みは他のエンティティでも問題なく機能するため、オフになっていないことは間違いありません。

面白いことに、画像を追加する前にコードと比較を以下のように変更すると、ユーザーが読み込まれ、正常に動作します。

if (AuthenticationHelper.CurrentUser != image.Device.User)
    return null;

まさにこの瞬間にユーザーをロードできたようです。この比較順序を変更すると、それに従うimage.Device.User != AuthenticationHelper.CurrentUserことはできなくなります。

これで何が起こっているのですか?

4

3 に答える 3

2

遅延読み込みが正しく機能していると私は主張します。ID が 1 の を見つけて、 のプロパティにDeviceアクセスせずに画像に割り当てています。モデルに明示的な外部キープロパティがないと、プロパティにアクセスされないため、値がなく、null が挿入されません。UserDeviceUserIDDeviceUser

モデルに追加してみてくださいUserID(またはUser_IDEntity Framework の規則を維持したい場合) Device、コードが機能するはずです。

于 2013-07-15T14:32:12.000 に答える
-1

「遅延読み込み」に関しては、Entity Framework は LINQ to SQL または NHibernate とまったく同じではありません。EF では、データベースなどのリソースにいつアクセスしているかを開発者が正確に認識できるようにすることが設計上の決定事項です。したがって、遅延読み込みは「自動」データベースの再クエリを有効にしません。むしろ、リソースの「遅延」ロードを提供します。EF は、開発者が気付かないうちに、後でセカンダリ データベース呼び出しを開始することはありません。代わりに、開発者はメソッドを明示的に呼び出して.Load()二次呼び出しを開始するか、.Include().

于 2013-07-16T10:51:56.203 に答える