EF не предназначен для прямой поддержки этой функции.EF - это ORM, а ORM в основном создается для целей, когда вы указываете типы, которые хотите использовать, и отображаете их во время разработки, а просто используете их во время выполнения.Это не означает, что невозможно создавать типы во время выполнения (с отображением кода), но это намного сложнее.
Контекст должен знать обо всех типах, которые он должен отображать, и об их отображении.Если вы создаете контекст без ссылки на ваш новый тип, он просто не знает об этом.Как это решить?Я могу подумать о двух вариантах:
- Также вывести код контекста и убедиться, что в коде испускаемого контекста содержится открытое свойство типа
DbSet<YourEmittedEntityType>
(для использования соглашений об отображении по умолчанию) или метод emit OnModelCreating
какхорошо, чтобы указать пользовательское отображение. - Emit конфигурации (производной от
EntityTypeConfiguration<YourEmittedEntityType>
) класса также для вашей новой сущности.Этот класс будет определять отображение новой сущности в вашей таблице базы данных.Когда у вас есть конфигурация, вы можете вручную создать DbModelBuilder
, зарегистрировать всю необходимую конфигурацию типов сущностей, включая ваши новые, созданные во время выполнения, собрать DbModel
, скомпилировать ее и использовать DbCompiledModel
для создания нового экземпляра DbContext
.Просто заставьте пользователя кешировать DbCompiledModel
для последующего использования, потому что его создание занимает очень много времени.
В обоих случаях убедитесь, что таблица, используемая для сохранения и получения новой сущности, уже создана, и отключите любую базу данных.инициализаторы - вы должны поддерживать свою базу данных вручную.
Конечно, это только первый шаг.Теперь вам нужно генерировать / генерировать код, который будет использовать вашу новую сущность и контекст - помните, что EF не работает с интерфейсами, и наследование обрабатывается специально, поэтому в большинстве сценариев вам необходим код, работающий непосредственно с вашим излучаемым типом.