EF CodeFirst - Получить все объекты - PullRequest
0 голосов
/ 02 мая 2018

У меня следующий контекст:

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}.

EDIT Я хочу получить сущности в OnModelCreating для создания индексов в определенных свойствах, которые украшены пользовательским атрибутом. На OnModelCreating я не могу получить доступ к контексту, как это объясняется в этом вопросе

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

На основании ответа от Вурд :

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;
}
0 голосов
/ 02 мая 2018

В коде вы можете вызывать ToList () на всех ваших DbSets. В противном случае вам придется написать хранимую процедуру, которая выполняет 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;
}

EDIT: Хорошо для безымянного списка, используйте рефлексию.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...