Создать DbSet<T> динамически в Entity Framework?
В LINQ to SQL я могу динамически создавать хранилище, используя DataContext.GetTable<T>
, Есть ли аналогичный способ сделать это в Entity Framework 4, кроме объявления свойств на конкретном DbContext
? Например:
public MyDbContext: DbContext
{
public DbSet<MySet> MySets {get; set;}
}
Я хотел бы знать, как я могу создать / получить ссылку на MySets
динамически, как я могу с LINQ to SQL, как в:
var mySet = MyDbContext.GetTable<MySet>();
2 ответа
Решение
DbContext
есть метод для этого:
var set = context.Set<MyEntity>();
Использование:
DbSet<MyEntity> set = context.Set<MyEntity>();
Или, если вы не можете использовать универсальный метод:
DbSet set = context.Set(
typeof( MyEntity )
);
Не беспокойтесь о повторной загрузке и дублировании POCO. Наборы кэшируются внутри контекста.
Это мой подход:
public static List<T> GetCollection<T>()
{
List<T> lstDynamic = null;
using (MyDbContext db = new MyDbContext())
{
DbSet mySet = db.Set(typeof(T));
mySet.Load();
var list = mySet.Local.Cast<T>();
lstDynamic = list.ToList();
}
return lstDynamic;
}
И вы вызываете эту функцию как:
List<Customer> lst = StaticClass.GetCollection<Customer>();
Это вернет всю вашу коллекцию. Я использовал это для выполнения функции кеширования для основных таблиц, которые не очень часто меняют свое содержимое.