2

私はEntityFrameworkが初めてなので、質問は少しばかげているかもしれませんが、Googleを検索しようとしましたが、何も見つかりませんでした.

私はdbにテーブルを持っています:

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    [Required]
    public UserProfile Owner { get; set; }
    [Required]
    public string Mask { get; set; }
    [Required]
    public string Key { get; set; }
    public DateTime Generated { get; set; }
    public DateTime DateTo { get; set; }
    public bool isElite { get; set; }

ここで、UserProfile Owner は別のテーブルへのリンクです。次のように選択すると:

 db.Keys.Where(s=>s.Owner.UserId == WebSecurity.CurrentUserId && s.DateTo > DateTime.UtcNow).ToList()

うまく機能しますが、ライセンスから所有者に到達しようとすると、常に null になります。所有者にライセンスを取得する方法を教えてください。お時間をいただきありがとうございます!

編集:私は間違いを犯し、質問を少し間違って投稿したと思います. 私が本当に必要としているのは、次のような ID でライセンスを検索するときです: License license = db.Keys.Find(id); 次のように所有者を取得できます: var a = license.Owner; 以前に Active Record を使用したことがあり、そのようなデータを「オンデマンド」でロードしました (呼び出したときのみ)。EFで何とかこれを行うことはできますか?

4

2 に答える 2

2

DbQuery.Include(string path) メソッドを利用する ここをクリック

それは少なくとも私にとってはうまくいきます。

ここにあなたのコードがあります:

db.Keys.Include("所有者").Where(s=>s.Owner.UserId == WebSecurity.CurrentUserId && s.DateTo > DateTime.UtcNow).ToList()

「キー」クエリが大量の結果を返すことが予想される場合、これは最適な方法ではない可能性があります。しかし、限られた数の結果しかないため、魅力的に機能しています。

于 2013-02-18T15:30:04.527 に答える
2

あなたが持っているコードを使用してvirtual、ライセンスクラスのようにマークすることで所有者を遅延ロードできます。

まだコンテキスト内にいるため (db を使用)、EF は自動的に呼び出してOwner.

関連エンティティの読み込みに関する優れた記事については、こちらをご覧ください。

編集(linqでクエリ):

これは linq クエリがどのように見えるかの例ですが、それでも所有者を遅延ロードまたは積極ロードする必要がある場合があります。

var query = from k in db.Keys
            where k.Owner.UserId.Equals(WebSecurity.CurrentUserId)
            && k.DateTo > DateTime.UtcNow
            select k;

var list = query.ToList();
于 2013-02-18T15:17:10.023 に答える