EF CodeFirst - 获取所有实体

时间:2018-05-02 15:59:27

标签: c# entity-framework

我有下一个背景:

public class MyContext : DbContext
{
   public virtual DbSet<Customer> Customers { get; set; }
   public virtual DbSet<Provider> Providers { get; set; }
   public virtual DbSet<Product> Products { get; set; }
}

是否存在获取我的上下文的所有实体的任何方法? 像MyContext.GetAllEntities()那样返回{Customer, Provider, Product}

修改 我想检索OnModelCreating中的实体,以便在使用自定义属性修饰的已确定属性中创建索引。 在OnModelCreating我无法访问上下文中的question

谢谢!

2 个答案:

答案 0 :(得分:0)

在代码中,您可以在所有DbSet上调用ToList()。否则,您必须编写一个存储过程来执行UNION并只调用sp。

public List<object> GetAllEntities(MyContext db)
{
    var results = new List<object>();
    results.AddRange(db.Customers.ToList());
    results.AddRange(db.Providers.ToList());
    results.AddRange(db.Products.ToList());

    return results;
}

修改 无名列表很好,然后使用反射。

MyContext db = new MyContext();
var resultsList = new List<object>();

PropertyInfo[] info = db.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach(PropertyInfo item in info)
{
   //Check for array, that it is a DbSet etc...
   var setType = item.PropertyType.GetTypeInfo().GenericTypeArguments[0];

   resultsList.AddRange(db.Set(setType).ToListAsync().Result);
}

return resultsList;

答案 1 :(得分:0)

根据Wurd的回复:

private IEnumerable<Type> GetAllEntities ()
{
   var entities = new List<Type> ();
   PropertyInfo[] info = GetType ().GetProperties (BindingFlags.Public | BindingFlags.Instance);
   foreach (PropertyInfo item in info) {
      var setType = item.PropertyType.GetTypeInfo ().GenericTypeArguments[0];
      entities.Add (setType);
   }
   return entities;
}