【问题标题】:Entity Framework - Shallow Eager Loading?实体框架 - 浅层渴望加载?
【发布时间】:2026-01-26 01:15:01
【问题描述】:

是否可以热切加载相关实体,但不加载相关实体的相关实体?

就我而言,我有一组标志来确定应该加载哪些相关实体:

[Flags]
public enum FooRetrievalOptions
{
    None = 0,
    Bar = 1,
    Baz = 2,
    All = Bar | Baz
}

我创建一个 IQueryable 并依次 .Include 取决于已设置的标志。

IQueryable<Foo> query = context.Foos;

if (fooRetrievalOptions.HasFlag(FooRetrievalOptions.Bar))
{
    query.Include(f => f.Bar);
}

if (fooRetrievalOptions.HasFlag(FooRetrievalOptions.Baz))
{
    query.Include(f => f.Baz);
}

List<Foo> foos = query.ToList();

这样做的问题是它可以在序列化时创建循环,具体取决于 Bar 和 Baz 上的导航属性。

我只是想在一个数据库匹配中加载关联实体,而不加载它们自己的相关实体。这可能吗?

【问题讨论】:

  • 你用什么库来序列化你的对象?
  • DataContractSerializer。我可以使用 IsReference = true 来处理循环,但这似乎会导致相当大的 XML。
  • 延迟加载在上下文中被禁用。这就是为什么我要指定急切加载哪些相关实体。
  • 如果您使用的是 .NET 4.5,IgnoreDataMemberAttribute 呢?
  • 在这种情况下这无济于事。该属性在某些情况下是必需的,但不是全部,具体取决于标志。

标签: c# entity-framework serialization entity-framework-6 eager-loading


【解决方案1】:

创建一个数据传输对象 (DTO) 并将所需的值复制到该对象中,然后再将其传递以进行序列化。在开发 API 以帮助处理 EF 循环引用并仅返回消费者需要的内容时,通常会执行此类操作。

edit:关于所有属性的看似繁琐的手动映射,有一些解决方案可以帮助解决这个问题,例如 Automapper:http://automapper.org/

【讨论】:

  • 这会起作用,但随着导航属性数量的增加,会令人沮丧地笨拙。
  • 我最终选择了这条路线。谢谢。
  • 将来也可以使用某种映射器进行检查,这可能会为您节省一些麻烦;将此注释添加到答案中。