Entity Framework: контекст используется в режиме Code First с кодом, который был сгенерирован из файла EDMX

Я разрабатываю приложение WPF с первым подходом базы данных EF 6, у меня есть один проект в моих решениях, если я запускаю свой проект, эта ошибка всегда появляется.

Контекст используется в режиме Code First с кодом, который был сгенерирован из файла EDMX для разработки Database First или Model First. Это будет работать неправильно. Чтобы устранить эту проблему, не удаляйте строку кода, которая выдает это исключение. Если вы хотите использовать Database First или Model First, убедитесь, что строка подключения Entity Framework включена в app.config или web.config проекта запуска. Если вы создаете свой собственный DbConnection, убедитесь, что это EntityConnection, а не какой-либо другой тип DbConnection, и передайте его одному из базовых конструкторов DbContext, которые принимают DbConnection. Чтобы узнать больше о Code First, Database First и Model First, см. Документацию по Entity Framework здесь: http://go.microsoft.com/fwlink/?LinkId=394715

Ответ 1

Моя ошибка заключалась в использовании стандартной строки подключения в конструкторе

(Server = test\test; Database = DB; User Id = test_user;Password = test),

но Entity Framework нужен другой формат

(metadata=res://*/DBModel.csdl|res://*/DBModel.ssdl|res://*/DBModel.msl;provider=System.Data.SqlClient;provider connection string="data source=test\test;initial catalog=DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""" providerName = ""System.Data.EntityClient)

Изменение: Изменен код для форматирования в виде кода, чтобы его было легче читать.

Ответ 2

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

например. если строка подключения выглядит так:

    <add name="MyModel" connectionString="data source=SERVER\INSTANCE;initial catalog=MyModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

Подготовьте metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;, чтобы он выглядел так:

<add name="MyModel" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;data source=SERVER\INSTANCE;initial catalog=MyModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

Ответ 3

Одна вещь, которую вы можете сделать, это... (если сначала база данных)

Откройте .edmx [Диаграмма] → щелкните правой кнопкой мыши → "Обновить модель из базы данных"

И посмотрите, появятся ли на вкладке "Добавить", "Обновить" и "Удалить".

Если не... возможно, ваше соединение сломано, и вместо него появится диалог для VS, создается новая строка соединения. =)

Ответ 4

Вы не должны использовать сгенерированную строку подключения, теперь у вас есть все файлы метаданных, включенные в ваше решение. Вместо этого попробуйте использовать в connection string раздел app.config:

"data source=localhost\sqlexpress; initial catalog=sample; integrated security=True;MultipleActiveResultSets=True;"

Ответ 5

Очень поздно, но все же полезно. Я застрял в подобной проблеме. Написал вопрос о SO и смог найти решение. Вы можете ссылаться на Ошибки строки подключения в С# Web Api. Моя ситуация заключалась в том, что у меня было две строки подключения в web.config(вы узнаете, почему, когда переходите к ссылке). Комментируя одну строку, вы поднимали ошибку, которую вы получили, комментируя другую, которая поднимала ошибку, как показано ниже:

Произошла ошибка при попытке создать контроллер типа AccountController. Удостоверьтесь, что у контроллера нет конструктора без параметров.

что я сделал: я назвал свою первую строку подключения как DefaultConnection, а в конструкторе класса ApplicationDbContext я дал это DefaultConnection. Теперь мой AccountController использует эту строку соединения, а во всех других контроллерах используется вторая строка подключения.   Это решило мою проблему.

Ответ 6

Я также столкнулся с таким же сообщением, но работал с веб-проектом MVC. Это сообщение запускается, когда я пытаюсь автоматически генерировать контроллер из импортированной модели. Кажется, что он не работает, потому что "это было создано из файла EDMX".

Хорошей новостью является то, что она работает, если я создаю модель, основанную на "Code First" вместо "EF Designer". Плохая новость заключается в том, что я не могу использовать EF Designer, если я хочу, чтобы работа контроллера автоматически работала. Не имеет значения, какой из этих двух способов вы создаете свою модель. Когда модель сгенерирована, вы используете ее таким же образом.

Пытается удалить все ваши объекты emdx из вашего проекта и воссоздать модель, основанная на Code First вместо EF Designer. Работал для меня!

Ответ 7

У меня есть два проекта:

Один для сгенерированного файла EDMX и всех связанных моделей.

Другой - это ASP.NET MVC Web.

Я столкнулся с этой проблемой, поскольку строка подключения, которую я использую в веб-проекте ASP.NET MVC, является обычной строкой, которую я использую при использовании подключения ADO.NET. Итак, я сделал следующее:

  • Откройте файл app.config в файлах проекта EDMX.

  • Скопируйте строку подключения.

  • Вставьте его в WEB-проект, поскольку он будет использоваться при запуске приложения.

Ответ 8

Добавьте metadata = "res:///MyModel.csdl | res:///MyModel.ssdl | res://*/MyModel.msl" к connectionstring, и providerName = "System.Data.EntityClient" решит проблему