【发布时间】: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