.net Core EF - динамически добавлять в DbSet по имени или типу строки - PullRequest
1 голос
/ 03 октября 2019

Предположим, у меня есть тысяча классов, которые все наследуют один базовый класс, и у каждого из этих классов (не базовых) есть таблица, каждый из которых имеет одинаковые обязательные столбцы. Как я могу использовать рефлексию или обобщения для добавления или обновления строки в правильной таблице? Я буду знать имя конкретной сущности во время выполнения.

Существует несколько сообщений от stackoverflow о получении dbset с отражением, но в результате получается IQueryable, к которому вы не можете добавить новый элемент. Эти постеры кажутся довольными этим, потому что я полагаю, что они просто загружают данныеМне нужен DbSet, чтобы я мог добавлять и обновлять. Я могу получить полное имя и тип объекта, но как мне получить DbSet с этим? Я не хочу писать оператор переключения на 1000 строк: (

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я использовал магические строки, чтобы добавить все свойства, которые, как я знал, будут присутствовать в базовом классе. Хотя это и не идеально, это добавило к правильной таблице, которая была конечной целью.

            var entityType = Assembly.GetAssembly(typeof(BaseTypeEntity)).GetType(namespacePrefix + typeName);

            // create an instance of that type
            object instance = Activator.CreateInstance(entityType);

            // Get a property on the type that is stored in the 
            // property string
            PropertyInfo prop = entityType.GetProperty("Active");
            prop.SetValue(instance, true, null);
            // .... more properties

            _context.Add(instance);
0 голосов
/ 03 октября 2019

Вы можете сделать это, динамически создав новый тип, который наследуется от DbContext, и использовать Reflection Emit для добавления DbSets к этому типу.

Это довольно длинное решение, чтобы попытаться опубликовать ответздесь, но вот ссылка GitHub на рабочую демонстрацию того, как это можно сделать - EF Core Dynamic Db Context

...