私のコントローラーアクションで、新しい画像をデータベースに追加しようとしています。イメージは、ユーザーに関連付けられているデバイスに関連付けられている必要があります。
だから私は私のエンティティクラスを持っています:
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
ことはできなくなります。
これで何が起こっているのですか?