[英]How to only get one level deep with EntityFramework 5 on navigation properties?
現在我禁用了代理創建:
context.Configuration.ProxyCreationEnabled = false;
我有一個像這樣的數據模型(刪除不相關的字段):
public partial class Video
{
public int VideoID { get; set; }
public string Title { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
}
public partial class User
{
public User()
{
this.Videos = new HashSet<Video>();
}
public int UserID { get; set; }
public string Username { get; set; }
public virtual ICollection<Video> Videos { get; set; }
}
我正在使用工作單元和存儲庫模式來加載我的數據,
獲取所有視頻,包括用戶對象:
var videos = videoService
.Include(v => v.User)
.Get()
我使用automapper從數據模型映射到域模型(因此在下面的屏幕截圖中的UI命名空間)。 當我檢查視頻枚舉時,我回來了,看看枚舉中的第一項,我去檢查用戶對象:
我在這里期待的是要用數據填充的VideoModel(ok),只有它的單個UserModel實體用數據填充(ok),而UserModel中的所有集合都是空的(這是破壞的)。 正如您在上面的第二個紅色框中所看到的,視頻集合中包含6個視頻。 在那些視頻中,用戶已被填寫。所以這基本上創建了一個非常大的對象圖。
1)我可以使用包含它只有1級深度(IE不填寫Video.User.Videos)嗎?
2)為什么ProxyCreationEnabled = false不處理這個問題? 我期待太多了嗎?
ps我想避免使用automapper為此創建客戶映射器。 pps我先做db,而不是先做模型
默認情況下,EntityFramework對虛擬屬性(例如示例中的User
和Videos
)使用延遲加載。 如果您希望在實際訪問這些屬性之前填充這些屬性,則可以使用Include()
或深入其他級別,使用嵌套的Select()
Include()
Select()
。
但是,此默認行為依賴於代理類的創建,您顯然已將其關閉。
不知道你想要做的所有事情,這可能不起作用,但似乎你會通過簡單地刪除ProxyCreationEnabled = false
並使用Include()
來獲得你想要的行為。
此外,在調試器中查看屬性可能會產生誤導,因為當您嘗試在調試器中查看屬性時,您實際上正在訪問該屬性(這可能導致延遲加載的實體或集合被正確填充,讓您認為它已經熱切地加載)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.