3

现在我禁用了代理创建:

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 实体填充 data(ok),并且 UserModel 中的所有集合都是空的(这是坏的)。正如您在上面的第二个红色框中所见,视频集合中包含 6 个视频。在那些视频上,用户的被填充了。所以这基本上创建了一个非常大的对象图。

1)我可以在使用包含时做到这一点,它只能进入 1 级深度(IE 不填写 Video.User.Videos)吗?

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

ps 我想避免使用自动映射器为此创建客户映射器。pps我先做db,而不是先做模型

4

1 回答 1

0

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

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

不知道您要尝试做的所有事情,这可能行不通,但似乎您只需按原样删除ProxyCreationEnabled = false和使用即可获得所需的行为Include()

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

于 2013-07-15T19:33:37.843 回答