c# - 如何使用 EntityFramework 5 在导航属性上只深入一层?

标签 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) 我可以在使用 include 时让它只进入 1 级深度(IE 不填充 Video.User.Videos)吗?

2) 为什么 ProxyCreationEnabled = false 不处理这个问题?我是不是期望太高了?

附注我想避免使用自动映射器为此创建客户映射器。 p.p.s.我先做数据库,而不是先做模型

最佳答案

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

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

不知道你正在尝试做的所有事情,这可能行不通,但看起来你只需删除 ProxyCreationEnabled = false 并使用 Include 就可以获得你想要的行为() 和你一样。

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

关于c# - 如何使用 EntityFramework 5 在导航属性上只深入一层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661929/

相关文章:

c# - .NET 中程序集的标记类型是什么?

c# - AzureStorageFile.Uri 未返回具有特殊字 rune 件名的正确 Uri,导致 404 响应

c# - 如何从 Lotus Notes 获取 Internet 地址

asp.net-mvc - 为什么在更新父级时,Entity Framework会插入子级?

c# - Linq Filtering items with ForEach crashes for large data set

c# - 带解析器的自动映射器抛出 "Error mapping types"

c# - 在 Silverlight 4 OOB 中恢复文件下载

c# - 100% CPU,卡在 CreateDelegate 和 CerHashtable`2.get_Item

entity-framework - 在多对多链接表上选择性地禁用级联删除

c# - 具有 EF 导航属性的自动映射器