如何只在导航属性上使用Entity Framework 5获得一个深度?

时间:2013-07-15 19:07:01

标签: c# entity-framework-5 automapper

现在我禁用了代理创建:

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命名空间)。当我检查视频枚举时,我回来了,看看枚举中的第一项,我去检查用户对象:

enter image description here

期待这里是要用数据填充的VideoModel(ok),只有它的单个UserModel实体用数据填充(ok),而UserModel中的所有集合都是空的(这是破产)。正如您在上面的第二个红色框中所看到的,视频集合中包含6个视频。在这些视频中,用户已经填写。所以这基本上会创建一个非常大的对象图。

1)我可以使用包含它只有1级深度(IE不填写Video.User.Videos)吗?

2)为什么ProxyCreationEnabled = false不处理这个问题?我期待太多了吗?

P.S。我想避免使用automapper为此创建客户映射器。 p.p.s.我先做db,而不是先做模型

1 个答案:

答案 0 :(得分:0)

默认情况下,EntityFramework对虚拟属性(例如示例中的UserVideos)使用延迟加载。如果您希望在实际访问这些属性之前填充这些属性,则可以使用Include()或更深层次的Include()使用嵌套Select()

但是,此默认行为依赖于代理类的创建,您显然已将其关闭。

不知道你要做的所有事情,这可能行不通,但似乎你只需删除ProxyCreationEnabled = false并使用Include()即可获得所需的行为。

此外,在调试器中查看属性可能会产生误导,因为当您尝试在调试器中查看属性时,您实际上正在访问该属性(这可能导致延迟加载的实体或集合被正确填充,让您认为它已经急切地加载了。)