Сначала код против базы данных сначала
Я создал модель Entity Framework на основе существующей базы данных, а затем сгенерировал объекты POCO из модели. Строка подключения в моем web.config не является Entity Framework, это просто стандартная строка подключения (в ней отсутствуют ссылки CSDL, SSDL, MSL).
Я могу скомпилировать свое приложение, но когда я запускаю, я получаю эту ошибку:
Код, сгенерированный с использованием шаблонов T4 для разработки Database First и Model First, может работать некорректно, если используется в режиме Code First. Для продолжения использования Database First или Model First убедитесь, что строка подключения Entity Framework указана в файле конфигурации исполняемого приложения. Чтобы использовать эти классы, которые были сгенерированы из Database First или Model First, с Code First добавьте любую дополнительную конфигурацию, используя атрибуты или API DbModelBuilder, а затем удалите код, который выдает это исключение.
Мой вопрос заключается в том, где в моем коде он понимает, что POCO пришли из автогенерации, и как я могу заставить его вести себя как Code First? Я не хочу ссылаться на CSDL и т. Д. В строке подключения.
3 ответа
Если в строке подключения есть метаданные, EF считает, что это Модель Сначала или База данных Сначала. Если это простая строка соединения, EF считает, что это Code First. Однако, если вы хотите начать сначала с модели, но заставите EF думать, что вы действительно делаете код в первую очередь (что вы и делаете), убедитесь, что вы используете генератор кода DbContext, а не генератор по умолчанию. Код POCO на самом деле - это "простые старые объекты C#"- никакой специальной базы данных не знает и не отслеживает изменения в них вообще. Чтобы использовать генератор кода DbContext, щелкните правой кнопкой мыши диаграмму модели и выберите "Добавить новый элемент генерации кода...", затем выберите ADO.NET DbContext Generator. Кроме того, в зависимости от того, как вы назвали свои первичные и внешние ключи и / или являются ли они более сложными, чем просто простые int-идентификаторы, вам, вероятно, потребуется заполнить некоторый код, чтобы отобразить отношения между вашими объектами в методе "OnModelCreating" в вашем контекст. Удалить строку throw new UnintendedCodeFirstException();
и замените его вашим кодом сопоставления. В противном случае EF не сможет выяснить все отношения (помните, что нет метаданных, на которые он мог бы положиться).
Надеюсь это поможет.
Вам нужно следующее в вашем конфигурационном файле:
<connectionStrings>
<add name="<The name of your class>"
connectionString="metadata=res://*/<test>.csdl|res://*/<test>.ssdl|res://*/<test>.msl;provider=System.Data.SqlClient;provider connection string="data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Сначала я использую базу данных и решил эту проблему, скопировав сгенерированную EDMX строку подключения в app.config моего запускаемого приложения. Один уже существовал, но, видимо, они отличались