【问题标题】:Entity Framework Core get entity without related entitiesEntity Framework Core 获取没有相关实体的实体
【发布时间】:2018-04-16 15:00:52
【问题描述】:

我对此进行了一些搜索,但到目前为止还没有找到合适的解决方案。我正在尝试从我的数据库中获取一个没有附加相关实体的实体。

函数如下return context.Entity.SingleOrDefault(n => n.Name == name) where context is a DbContext.

到目前为止,回复仅包含一个实体,但添加了 50 个我不需要的“子”实体。

从数据库中获取单个实体的最佳方法是什么?

使用EFC2.1 pre release build

编辑:

还发现如果使用DbContext.Entity.AsNoTracking,可以得到不带子集合的实体。

不确定在进行更改并调用DbContext.saveChanges()后是否会保存完整的实体

【问题讨论】:

  • 在您的 DbContext 构造函数中:LazyLoading = false;
  • @Atlasmaybe 好吧,问题是我在其他大部分时间确实需要连接。我只需要几次没有添加实体的单个实体,所以我宁愿不进行更改
  • 将您的导航属性定义为虚拟以启用延迟加载 - public virtual ICollection NavigationProperty
  • 那么,为什么不向您的 DbContext 添加另一个构造函数呢?还有另一种选择,例如使用匿名对象仅查询想要的对象,但它比添加另一个构造函数稍微复杂...
  • @Atlasmaybe 试过了,你的答案确实有效。它使我能够在没有所有子记录的情况下获取实体。我决定将 Nish26 的评论作为答案,因为对我来说实施稍微容易一些。

标签: c# entity-framework-core dbcontext


【解决方案1】:

您必须启用延迟加载,只需像这样向您的类添加一个属性。

public virtual ICollection<ChildType> NavigationProperty;

这是Loading Related Data 的一个非常有用的文档。

【讨论】:

    【解决方案2】:

    我最近发现你也可以使用 DbContext.Entity.AsNoTracking() 来达到这个目的。

    在获取实体时使用 linq 查询将导致 linq 中包含的所有相关实体也被获取。

    假设你有a Teacher, a Student and a Classroom entity。一位教师可以有多个学生和教室。您想找到 A 教室的所有老师和所有男学生,这样您就可以这样做

    DbContext.Teachers.Where(x => x.Classroom.Name = "A" && x.Student.Gender = "Male")
    

    这将获取 Teacher entities 以及所有底层 ClassroomsStudents,因为您在 linq 表达式中调用了它们。 由于您只需要 Teacher 实体,因此您应该使用以下内容:

    DbContext.Teachers.AsNoTracking().Where(x => x.Classroom.Name = "A" && x.Student.Gender = "Male")
    

    使用AsNoTracking(),您声明您不想要底层数据,只需要它过滤您想要的实体。

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2020-08-06
      • 2022-01-19
      • 1970-01-01
      • 2017-06-13
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多