[英]Navigation properties not loading properly
我的上下文如下:
public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = true;
}
//DbSet properties
}
所以,啟用了延遲加載。
我有以下課程:
public class Home
{
private ICollection<Slide> _slides;
[Key]
[Required]
public string Name { get; set; }
[ForeignKey("Header")]
public int? HeaderID { get; set; }
//Navigation properties
public ICollection<Slide> Slides
{
get { return _slides ?? (_slides = new List<Slide>()); }
set { _slides = value; }
}
public Content Header { get; set; }
}
請注意,導航屬性Header
和Slides
都使用沒有 virtual
關鍵字。 據我所知,當我們不使用virtual
關鍵字時 - 屬性應該急切加載。
但是,當我從數據庫獲取我的Home
實體時,我的兩個導航屬性都為null
(但屬性HeaderID
具有值)。
即使我切換到this.Configuration.LazyLoadingEnabled = false;
- 未加載的屬性 - 它們仍為null
。
以下是我從db獲取數據的方法(使用存儲庫模式):
public static Home GetHomeComponent(
this IRepositoryAsync<Home> repository)
{
var result = repository
.Query()
.Select()
.First();
return result;
}
我用Include
屬性解決了我的問題:
public static Home GetHomeComponent(
this IRepositoryAsync<Home> repository)
{
var result = repository
.Query()
.Include(x => x.Header)
.Include(x=>x.Slides)
.Select()
.First();
return result;
}
但是這對我來說不方便(因為我有太多的導航屬性要加載)。
所以,我的問題是:
我不使用virtual
關鍵字 - 但為什么我的導航屬性沒有急切加載?
或者我做錯了什么? 有沒有其他方法加載我的導航屬性而不使用Include
?
如果你不使用virtual
關鍵字,它只意味着一旦你嘗試訪問非虛擬屬性,它將不會從數據庫加載,但你會得到一個Null
。
這並不意味着你將立即填充實體的所有屬性,在你的代碼中填充Slides
for EG,你必須使用.Include() - 這是急切的加載,在你之前加載你自己的屬性用過的 。
您可以創建一個通用函數,通過它獲取的參數填充所需的屬性(使用params),請參閱此處了解更多詳細信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.