EF:ナビゲーションプロパティは、アクセスしたり、仮想キーワードを削除したりしても、nullです。

.net asp.net-core c# entity-framework-core

質問

私はエンティティのフレームワーク(コア)慣れていない、私は思っているように怠惰な読み込みに関連するいくつかの問題に直面している。

私は、 1対1の関係を持つ次の単純なデータモデルを持っています。

User ----- AccessToken

ユーザー:

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

    public virtual AccessToken AccessToken { get; set; }
}

アクセストークン:

public class AccessToken
{
    public int Id { get; set; }
    public string Token { get; set; }

    [ForeignKey("User"), Required]
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

今度は、ユーザーのナビゲーション・プロパティーを使用してユーザーのAccessTokenを取得しようとすると、常にnullになります

var t1 = Context.Find<User>(user.Id);
var t2 = t1.AccessToken;
var t3 = Context.Find<User>(user.Id).AccessToken;

また、ナビゲーションプロパティからvirtualキーワードを削除しようとしましたが、成功しませんでした。

その問題を解決してくれる人がいらっしゃいますか?

受け入れられた回答

まず、これは1:1の関係ではありません。データベースに関しては、同じUserId持つ複数のAccessTokenが存在する可能性があります。つまり、1:nの関係です。実際の1:1の関係にするには、モデルは次のようになります。

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

    public virtual AccessToken AccessToken { get; set; }
}

public class AccessToken
{
    [ForeignKey("User")]
    public int Id { get; set; }
    public string Token { get; set; }

    public virtual User User { get; set; }
}

今度はどのAccessTokenもそのUserのPKと同じPKを持つので、一意であり、 1人のユーザーだけに結びついています。

次に、コメントで述べたように、遅延ロードはEFコアではまだサポートされていません。それが(今までにあったのであれば)まで、あなたはInclude (eager loading)を使う必要がありInclude ...

using (var db = new MyContext())
{
    var user = db.Users.Include(u => u.AccessToken)
                 .Single(u => u.Id == 1);
}

...またはデータを別々に読み込みます(eplicit loading):

    db.AccessTokens.Where(a => a.Id == 1).Load();
    var user = db.Users
                 .Single(u => u.Id == 1); // Or db.Users.Find(1)

後者の場合、EFはリレーションシップフィックスアップによってユーザーとトークンを接続します。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ