Как выполнить запросы по динамической модели, используя только метаданные? - PullRequest
0 голосов
/ 05 января 2019

Я делаю миграцию унаследованного приложения, чтобы перейти от выполнения необработанного SQL к использованию ORM. Конструкция базы данных заключалась в том, что немногие объекты, такие как «Счета», «Транзакции», «Клиенты» имеют соответствующие таблицы с дополнительными полями (каждый клиент, который купил наше приложение - размещается всегда на своем месте, имеет уникальный набор этих полей), а те, что создаются с помощью столбцов (вздох) ). Так что для Транзакций у вас есть таблица TransExt, и если клиент нашего приложения хочет, чтобы дополнительные поля были, например, Description1 и Description2, таблица TransExt будет иметь 3 столбца, TransactionId, Description1, Description2. Что я хочу, так это без усилий управлять написанием и чтением их (только базовые операции), абстрагируя различия в базе данных нашего клиента.

Поскольку только 5 таблиц из 40 не являются константами, для меня имело смысл создать один большой DbContext и несколько меньших DbContexts с этими таблицами изменения для каждого клиента, добавляя маленький DbContext в большую. Это дало бы нам простой способ изменить другую таблицу для всех клиентов и изменить эти «динамические» таблицы для каждой из них в отдельности. Я добавляю меньший DbContext в основной, в зависимости от значения app.config с именем нашего клиента, и он отлично работает. Однако injectedContext содержит только метаданные (что имеет смысл). Как я могу использовать их для запуска обновлений / чтений?

Main DbContext имеет открытое свойство injectedDbContext (в конструкторе). Ничего особенного там нет. Внедренный контекст - ClientExtContext. Я могу использовать их как

var db = new MainDbContext();
//db.constantTable //works
//db.ClientExtContext.TransExt //doesn't
var list = db.ClientExtContext.Model.GetEntityTypes().ToList()  //shows a list of object mapped to tables like TransExt, AccountsExt
list.ElementAt(7).GetProperties().ToList(); //gives me list of objects mapped to fields like Description1, Description2

Я хочу сделать над ними операции. Например

var db = new MainDbContext();
var list = db.ClientExtContext.Model.GetEntityTypes().ToList()
var fieldsList = list.ElementAt(7).GetProperties().ToList();

list.where(s=>s.Name=="TransExt").Where(string.Format("{0} = {1}",fieldsList.ElementAt(0),someId) //this would give me TransExt row with someId, since fieldsList.ElementAt would point at column Id, using dynamic Linq
.Update(fieldsList.ElementAt(1), someDescription1Value); //first column which is Description1
db.SaveChanges();

Или, может быть, лучший дизайн?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...