2017-03-05 31 views
0

後,我是新來的實體框架(核心),我面臨着與延遲加載一些問題,我想。EF:導航屬性爲null甚至訪問它或刪除虛擬關鍵字

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

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 erty它總是

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

我也試圖從沒有成功的導航屬性中刪除virtual關鍵字。

有人會幫我解決這個問題嗎?

+1

您使用EF Core嗎? (我看到你的問題被標記爲EF6,但我仍然相信你使用核心)EF核心不支持延遲加載,請參閱http://stackoverflow.com/a/42596737/455493。請使用搜索,它的第二或第三個問題在48小時內 – Tseng

+0

@Tseng好吧,我需要使用包括。謝謝。 –

+0

ok微軟提到這一點:'實體框架核心將自動修復導航屬性到以前加載到上下文實例中的任何其他實體。因此,即使您沒有明確包含導航屬性的數據,如果某些或所有相關實體先前已加載,該屬性仍可能被填充。「但實際上並未發生!如果我理解正確的話。 –

回答

2

首先,這不是1:1的關係。至於數據庫,可以有多個AccessToken,具有相同的UserId,即它是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將有一個PK這與其對User的PK,所以它的獨特綁只一個用戶。

接下來,如評論所述,EF內核尚未支持延遲加載。直到它(?如果有的話),你必須使用Include(預先加載)...

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

...或單獨加載數據(eplicit加載):

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

在後面情況下,EF將通過關係修復連接用戶及其令牌。

+1

實際上,OP設置**是一對一(EF :)核心改進之一)。這是一個具有唯一約束的FK。但是當然你對其餘的人是正確的。 –

+0

這正是我現在正在做的(使用include),但是這會使得使用存儲庫和工作單元模式幾乎不可能,以防每次都要加載不同數量的導航屬性(例如,有時不導航屬性,有時是1 ,另一次4,等等),在這種情況下,我發現沒有方法來編寫任何通用的有用的存儲庫的情況下...我希望支持懶加載很快...... btw,這是什麼阿呆( )功能? –

+1

@Ivan我試着用'UserId'字段。我看到EF6的差異,但沒有意識到它實際上表現爲1:1。即使那樣,我想我也希望數據庫模式本身也實施它(儘可能多)。順便說一句,最近我開始對ef-core很滿意。 –