Есть база в которой много таблиц с одинаковой структурой, и с наименованиями в стиле object_####_
Можно ли как-то одной модели маппить все эти таблицы разом, а не делать 100500 моделей по количеству таблиц?
Что бы потом можно было работать с нужной таблицей по наименованию.
Я пока вышел из ситуации через rawquery. Если в ef core такое невозможно, то какие есть альтернативы с подобным функционалом?
Здравствуйте, Lev_Limin, Вы писали:
L_L>Есть база в которой много таблиц с одинаковой структурой, и с наименованиями в стиле object_####_ L_L>Можно ли как-то одной модели маппить все эти таблицы разом, а не делать 100500 моделей по количеству таблиц? L_L>Что бы потом можно было работать с нужной таблицей по наименованию.
1) Сложный путь, обычно подходит когда в уже существующей базе нужно разбить таблицу на несколько (либо собрать из нескольких) по какому-то критерию (партиционировать).
MS SQL Server (возможно и в других СУБД есть такой функционал): Если в таблицах есть столбец уникально идентифицирующий данные в этой таблице (ObjectType, ObjectId, дата,...) общий для всех записей в конкретной таблице, и если есть возможность модифицировать схему базы, то можно использовать т.н. Partitioned Views:
-во всех таких таблицах создать констрейнты на этот столбец (столбец партиционирования)
-создать вьюху, напр. Objects, объединяющую с пом. UNION ALL все эти таблицы
-в запросах работать только с этой вьюхой, используя фильтр по этому столбцу, SQL Server сам поймет, для какой таблицы нужно выполнить запрос.
ps: есть нюансы (и немало, см. по ссылке выше), напр. если столбец партиционирования не входит в PK, то для insert/update/delete придется написать тригеры для вьюхи
2) По идее универсальный, подойдет как к EF, так и к linq2db
— Создать интерфейс, напр. IObjectTable, который будут реализовывать все 100500 нужных таблиц
— Код работы с таблицами писать обобщенно:
string[] SelectSomethingFromTable<TObjectTable>(...) where TObjectTable : IObjectTable
{
...
var table = dbContext.Set<TObjectTable>() [EF]/dbContext.GetTable<TObjectTable>() [linq2db];
...
}
3) Про linq2db выше уже сказали: db.GetTable<..>().TableName(..)
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Lev_Limin, Вы писали:
L_L>>Есть база в которой много таблиц с одинаковой структурой, и с наименованиями в стиле object_####_
S>Ну вот нафига было такое делать? Должна быть 1 таблица с доп. полем ObjectType
Сделано было очень давно, но проектов, которые используют такую структуру, очень много.
Здравствуйте, Lev_Limin, Вы писали:
L_L>Здравствуйте, Shmj, Вы писали:
S>>Здравствуйте, Lev_Limin, Вы писали:
L_L>>>Есть база в которой много таблиц с одинаковой структурой, и с наименованиями в стиле object_####_
S>>Ну вот нафига было такое делать? Должна быть 1 таблица с доп. полем ObjectType
L_L>Сделано было очень давно, но проектов, которые используют такую структуру, очень много.
Все правильно, так человеки избавлялись от локов таблиц. Если у вас такая структура, то EF Core вам не светит.
В linq2db это встроено по умолчанию, а EF придется постоянно новый контекст прокидывать с новой моделью. А это значит что одновременно с двумя такими таблицами вы работать не сможете.