【问题标题】:Get List of Entity Models in DbContext Entity Framework Core 2.1获取 DbContext Entity Framework Core 2.1 中的实体模型列表
【发布时间】:2019-06-08 19:33:53
【问题描述】:

我正在尝试找到一种方法来获取我的 DbContext 中所有实体模型的列表。例如,如果我在 C# 中定义了两个名为 Customer 和 Invoice 的模型,它们通过代码优先创建了 EF 实体和一个数据库,我现在如何查询 DbContext 以获取其中包含 Customer 和 Invoice 的列表 - 即,该上下文中的所有实体?我希望能够调用一个返回所有实体列表的方法——不是数据,只是一个实体列表。

在我看来这应该很容易,但要么并不容易,要么我遗漏了一些东西——可能是后者。 ;-)。

有人可以指点我正确的方向吗?谢谢!!

【问题讨论】:

  • “所有实体的列表——而不是数据”是什么意思?他们的 ID 列表?如果不是数据,列表包含什么?

标签: c# ef-core-2.1 .net-core-2.1 entity-framework-core-2.1


【解决方案1】:

可以使用Model属性获取关联的IModel,然后GetEntityTypes方法枚举所有IEntityTypes。 IEntityTypeClrType 属性将为您提供关联的类类型,例如

DbContext db = ...;
var entityTypes = db.Model.GetEntityTypes().Select(t => t.ClrType).ToList();

IEntityType 具有许多有用的属性和(扩展)方法,用于获取有关主/备用键、外键、导航、属性等的信息,以备您需要时使用。

【讨论】:

  • 谢谢!这正是我所需要的!感谢您的帮助。
  • 当我尝试使用这些类型来使用 context.Entry(Type).Reload() 时,它会在运行时引发错误。有什么方法可以实现吗?
  • @MSK 不确定您的意思 - context.Entry 方法需要实体实例(对象),而不是类型。
  • 谢谢@IvanStoev,我也认出来了。实际上我需要一个通用的解决方案来重新加载数据库。
  • @IvanStoev 如何使用 DbContext 名称使用反射而不是实例获得相同的实体类型?
【解决方案2】:

您可以参考文档:https://docs.microsoft.com/en-us/ef/core/querying/related-data

例如。如果您有博客和帖子作为两个表,那么您可以获得如下所示的相关表。这取决于关系如何出现在两个表中。

您还可以添加 where 子句以仅获取选定的记录。

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
        .ToList();
}

【讨论】:

  • 感谢您的回复,但我正在寻找的只是上下文中所有实体模型的列表。例如,我希望能够键入 myContext.GetEntityModels() 并让它返回该上下文中所有模型的列表——而不是数据或它们之间的任何关系。
猜你喜欢
  • 2017-06-13
  • 2022-01-19
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多