Entity Framework Code First, указывающий на сущности - PullRequest
0 голосов
/ 17 октября 2011

Я получаю исключение 'Тип сущности [TYPE] не является частью модели для текущего контекста.'при попытке запустить мое приложение.

Мое лучшее предположение на данный момент состоит в том, что он не распознает мой тип как тип, который был отображен.Это вполне может быть, так как это тип, загружаемый во время выполнения.Этот тип происходит из другой сборки.

Как EF: CF находит все свои объекты для сопоставления и как я могу заставить его находить мои типы?

1 Ответ

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

EF не предназначен для прямой поддержки этой функции.EF - это ORM, а ORM в основном создается для целей, когда вы указываете типы, которые хотите использовать, и отображаете их во время разработки, а просто используете их во время выполнения.Это не означает, что невозможно создавать типы во время выполнения (с отображением кода), но это намного сложнее.

Контекст должен знать обо всех типах, которые он должен отображать, и об их отображении.Если вы создаете контекст без ссылки на ваш новый тип, он просто не знает об этом.Как это решить?Я могу подумать о двух вариантах:

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

В обоих случаях убедитесь, что таблица, используемая для сохранения и получения новой сущности, уже создана, и отключите любую базу данных.инициализаторы - вы должны поддерживать свою базу данных вручную.

Конечно, это только первый шаг.Теперь вам нужно генерировать / генерировать код, который будет использовать вашу новую сущность и контекст - помните, что EF не работает с интерфейсами, и наследование обрабатывается специально, поэтому в большинстве сценариев вам необходим код, работающий непосредственно с вашим излучаемым типом.

...