EF:導航屬性即使在訪問它或刪除虛擬關鍵字後也為空

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

我是實體框架(核心)的新手,我正面臨一些與延遲加載有關的問題。

我有以下簡單的數據模型與一對一的關係:

User ----- AccessToken

用戶:

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

    public virtual AccessToken AccessToken { get; set; }
}

的accessToken:

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,所以它是唯一的並且只與一個用戶綁定。

接下來,如評論中所述,EF核心尚不支持延遲加載。直到它(如果有的話)你必須使用Include (急切加載)......

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

...或單獨加載數據(顯式加載):

    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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow