Сначала код против базы данных сначала - PullRequest
20 голосов
/ 23 декабря 2011

Я создал модель Entity Framework на основе существующей базы данных, а затем сгенерировал объекты POCO из модели. Строка подключения в моем web.config не является Entity Framework, это просто стандартная строка подключения (в ней отсутствуют ссылки CSDL, SSDL, MSL).

Я могу скомпилировать свое приложение, но при запуске выдается следующее сообщение:

Код, созданный с использованием шаблонов T4 для Database First и Model Первая разработка может работать некорректно, если используется в режиме Code First. Для продолжения использования Database First или Model First убедитесь, что сущность Строка подключения фреймворка указана в конфигурационном файле выполнение заявки. Чтобы использовать эти классы, которые были сгенерированы из База данных Сначала или Модель Сначала, с Кодом Сначала добавьте любые дополнительные Конфигурация с использованием атрибутов или API DbModelBuilder, а затем удалить код, который выбрасывает это исключение


У меня вопрос: где в моем коде он понимает, что POCO пришли из автогенерации, и как мне заставить его вести себя как Code First? Я не хочу ссылаться на CSDL и т. Д. В строке подключения.

Ответы [ 3 ]

23 голосов
/ 23 декабря 2011

Если в строке подключения есть метаданные, EF считает, что это Model First или Database First. Если это простая строка соединения, EF считает, что это Code First. Однако, если вы хотите начать сначала с модели, но заставите EF думать, что вы действительно делаете код в первую очередь (что вы и делаете), убедитесь, что вы используете генератор кода DbContext, а не генератор по умолчанию. Код POCO на самом деле - это «простые старые объекты c #» - никакой специальной базы данных не знает и не отслеживает изменения в них вообще. Чтобы использовать генератор кода DbContext, щелкните правой кнопкой мыши на диаграмме модели и выберите «Добавить новый элемент генерации кода ...», затем выберите ADO.NET DbContext Generator. Кроме того, в зависимости от того, как вы назвали свои первичные и внешние ключи и / или являются ли они более сложными, чем простые int ID, вам, вероятно, потребуется заполнить некоторый код, чтобы отобразить отношения между вашими объектами в методе "OnModelCreating" в вашем контекст. Удалите строку throw new UnintendedCodeFirstException(); и замените ее вашим кодом отображения. В противном случае EF не сможет выяснить все отношения (помните, что нет метаданных, на которые он мог бы положиться).

Надеюсь, это поможет.

12 голосов
/ 16 августа 2012

Вам нужно следующее в вашем конфигурационном файле:

<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=&quot;data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" />
</connectionStrings>
0 голосов
/ 04 мая 2015

Сначала я использую базу данных и решил эту проблему, скопировав сгенерированную EDMX строку подключения в app.config моего запускаемого приложенияОдин уже существовал, но, видимо, они отличались

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