【问题标题】:How to stop Entity Framework from including properties I don't want it to?如何阻止实体框架包含我不想要的属性?
【发布时间】:2019-10-27 10:41:37
【问题描述】:

从我的DataContext 读取实体类型时,当我不想要它们时,我会得到所有关联的对象。如何设置 EF,以便我只进行显式加载?

从这里阅读 msdn 信息: https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-2-2/

似乎我不应该免费获得任何东西,所以显式加载是一种方式,但是我正在使用下面的代码,但我的结果超出了我的预期。

public class TalesContext : DbContext
{
    public TalesContext()
    {
    }

    public TalesContext(DbContextOptions<TalesContext> options) : base(options)
    {
    }

    protected internal DbSet<Story> Stories { get; set; }
    protected internal DbSet<Event> Events { get; set; }
    protected internal DbSet<StoryEventMention> EventMentions { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (optionsBuilder.IsConfigured) return;

        optionsBuilder.UseInMemoryDatabase("TalesTesting");
    }
}

public class Event
{
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public IList<StoryEventMention> EventMentions { get; set; }
    [MaxLength(128)]
    public string Title { get; set; }
}


var query = from e in TalesContext.Events select e;
// various query.Where
query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
return query.ToList();

我希望得到一个事件列表,其中填充了 Id 和 Titles 并且 EventMentions 为空。但是,我得到了 EventMentions 以及所有其他导航属性。几乎是整个测试数据库。

我在运行单元测试和通过 API 公开它时得到这个。

【问题讨论】:

  • 不要使用 IList。您不应该在公共 API 中公开 IList。你可以在这里阅读更多内容:docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…。关于你的问题。尝试将 EventMentions 声明为公共虚拟 ICollection 并重试。
  • API 控制器返回 List,并具有 IActionResult 返回类型。但是那个链接很有用也很有趣,谢谢。我也尝试了你的建议,不幸的是它对回报没有任何影响。不过我会在星期五再试一次并探索更多。

标签: c# entity-framework-core-2.2


【解决方案1】:

回答你的问题。我相信你需要做的是 在你的 TalesContext 中调用这个:

this.Configuration.LazyLoadingEnabled = false;

来源: 解释延迟加载: https://www.entityframeworktutorial.net/lazyloading-in-entity-framework.aspx

解释急切加载和延迟加载之间的区别 https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

【讨论】:

  • 非常感谢,但这是针对实体框架而不是实体框架核心。我在 TalesContext 上没有配置属性。
【解决方案2】:

请注意,我不能制作 cmets,我并不是要以此作为答案。

您需要创建一个实例。它不是静态属性,而是实例属性。

【讨论】:

    【解决方案3】:

    我发现了我的错误。

    我的 EventFetcher 类是一个单例,通过 IoC 注册。它有一个对 TalesContext 的引用,也通过 IoC 注册为单例。所以我通过应用程序获得了一个 DataContext。因此,当第一个请求进来时,它会为数据库播种 - 并且所有内容都在其中。因此,对象之间的所有引用都已经构建好了,当我请求一个而没有明确包含它时,上下文返回了它已经拥有的数据,并附加了所有内容。

    我对此进行了重组,以便将新的上下文注入到每个请求的控制器中,并且行为正是您所期望的。所以这里的教训是,如果您在查询时开始得到意外结果,请注意数据上下文的年龄和持久性。

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多