Entity Framework , Работа с моделью данных

115
08 сентября 2019, 01:00

У меня в базу данных заливается множество таблиц с одинаковой схемой , например

f170101 , f170102 , т.е каждый день появляются новые. Вопрос такой, как в Entity Framework Можно подменять имя таблицы выполняя .ToList() чтобы данные подгружались из определенной таблицы

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<ORMAdisCalls>().ToTable(TableName, schema: "statistica_call");
}

Как динамически возможно сделать такую подмену , в запущенной программе всегда возвращаются данные с той таблицы , которая была передана методу выше

Answer 1

Можно использовать разные контексты для выполнения операций над таблицами.

Создадим контекст, в конструктор которого будем передавать наименование таблицы. Поскольку контекст кэширует DataModel, нам потребуется придумать свой механизм определения ключа, по которому будет выполняться кэширование модели. Для этого создается класс DynamicModelCacheKeyFactory :

class MyDbContext : DbContext
{
    public MyDbContext(string tableName)
    {
        TableName = tableName;
    }
    public string TableName { get; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
         modelBuilder.Entity<ORMAdisCalls>().ToTable(TableName, schema: "statistica_call");
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder
            .ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
    }
}
public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
    public object Create(DbContext context)
    {
        if (context is MyDbContext dynamicContext)
        {
            return (context.GetType(), dynamicContext.TableName);
        }
        return context.GetType();
    }
}   

Добавим метод, который создает экземпляр контекста и возвращает нужные нам данные:

List<ORMAdisCalls> GetORMAdisCalls(string tableName)
{
    using (var context = new MyDbContext(tableName))
    {
        return context.Set<ORMAdisCalls>().ToList();
    }
}

Получим содержимое из разных таблиц в одну и ту же модель:

void Foo()
{
    var table1Calls = GetORMAdisCalls("f170101");
    var table2Calls = GetORMAdisCalls("f170102");
}
READ ALSO
Перенос части таблицы datagrid wpf на другую страницу FlowDocument

Перенос части таблицы datagrid wpf на другую страницу FlowDocument

Печатаю содержимое FlowDocumentReader, который содержит текстовые данные и таблицу datagridКусок разметки с таблицей:

131
C# WPF LINQ обратиться к последней ветке группы

C# WPF LINQ обратиться к последней ветке группы

Мне нужно сгрупировать коллекцию по нескольким свойствам, я делаю так:

138
Переход между 2d и 3d в unity

Переход между 2d и 3d в unity

я пишу простенькую игру на Unity и работаю в 2d измерении, но я хотел бы реализовать переход между 2d и 3d: Игрок в 2d режиме входит в портал и резко...

98
Нужна помощь с TabControl

Нужна помощь с TabControl

Всех привествую, появился вопросНе могу при нажатии кнопки Clear не стираются позиции чексбоксов и текстовых полей

145