簡體   English   中英

如何在導航屬性上只使用EntityFramework 5獲得一個深度?

[英]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對虛擬屬性(例如示例中的UserVideos )使用延遲加載。 如果您希望在實際訪問這些屬性之前填充這些屬性,則可以使用Include()或深入其他級別,使用嵌套的Select() Include() Select()

但是,此默認行為依賴於代理類的創建,您顯然已將其關閉。

不知道你想要做的所有事情,這可能不起作用,但似乎你會通過簡單地刪除ProxyCreationEnabled = false並使用Include()來獲得你想要的行為。

此外,在調試器中查看屬性可能會產生誤導,因為當您嘗試在調試器中查看屬性時,您實際上正在訪問該屬性(這可能導致延遲加載的實體或集合被正確填充,讓您認為它已經熱切地加載)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM