Требуемая версия net framework не содержит сборок времени выполнения платформы entity framework
Entity Framework состоит из средств EF для Visual Studio и среды выполнения EF.
7 Answers 7
I was able to create the models by using Paul Sinnema's link and using SQL authentication instead of Windows Auth (in my case):
You will need to install the following packages from NuGet:
Afted that run the following command in the Package Manager Console: (Tools>Nuget Package Manager>Package Manager Console)
There the Scaffold-DbContext command is explained and that works just fine.
Try to install Dot Net Framework lower versions manually or use a visual studio installer to modify the versions. After creating a project right click and go to properties, where you can change the target version. I changed it to 4.8 and the ADO Entity Model is working fine for me
As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
You can then build out this class library to handle all of your EntityFramework actions for that particular database. Or you can install the EntityFramework package and reference the classes from within the original project. Just make sure you remember to add the class library as a reference and dependency to your original project in the solution.
You can really do whatever you want with the classes after you have the wizard generate them for you.
1.такая проблема. EF последняя версия. Visual Studio. Создал простую базу данных. Создал модель. Создал таблицу. Через код добавляю в таблицу данные. Одну строчку он добавляет. Но вот как впишу еще одну например с названием "bu2" то уже ошибка на моменте db.SaveChanges();
System.Data.Entity.Infrastructure.DbUpdateException: "При обновлении записей возникла ошибка. Дополнительные сведения приведены во внутреннем исключении."
SqlException: Violation of PRIMARY KEY constraint 'PK__Buffet__3214EC070BE69470'. Cannot insert duplicate key in object 'dbo.Buffet'. The duplicate key value is (0). The statement has been terminated.
2.Даже когда на одной строке срабатывает, я открываю таблицу, там нету записанных данных, получается что база данных ничего не записывает?
3.Почему в db. я уже нахожу свою таблицу во множественном числе с буквой s на конце?
Вот так решается проблема, не хочет автоматом Id прописывать, но второй вопрос остается все еще открытым.
покажите как у вас объявлен Buffet.
PashaPash Если вы вот это имеете ввиду, то вот так:
Автоматом при создание модели генерирует.
что проверяете именно в той базе?
Захожу в таблицу Buffet, а там всюду null, после отладки не сохраняются данные.
как именно у вас база подключена?
Она подключена обычно:) не знаю как точно ответить. Создал простую базу в VS, создал модель. На ней зеленая розетка, но при запуске отладки загорается крестик красные, может она просто отключается на отладку. Нашел тут на форму ответ, что нужно поставить if newer в свойствах базы данных. Я та понял это в свойствах базы данных, у меня рус. версия. Как я понял это связано с "Копировать в выходной каталог", но переключая там на разные вкладки снова ошибка на SaveChages().
Вообще он сам автоматом должен генерировать новый id, проблему решил тем, что в блок инициализации в ручную вписывал id. и вписал все в using. Но второй вопрос еще остается открытым
@FX_Sektor должен. покажите как у вас объявлен Buffet. По второму вопросу - вы уверены, что проверяете именно в той базе? как именно у вас база подключена?
по поводу третьего вопроса: это поведение по умолчанию, экземпляр в единственном числе, а место где хранится во множественном(как мне кажется все логично), если Вас не устраивает такое поведение то его можно отключить
Средства EF для Visual Studio
Entity Framework Tools для Visual Studio включают в себя конструктор ef и мастер моделей ef и необходимы для первой базы данных и моделирования первых рабочих процессов. Средства EF включены во все последние версии Visual Studio. при выполнении выборочной установки Visual Studio необходимо убедиться, что выбран пункт "Entity Framework 6 инструментов", выбрав рабочую нагрузку, содержащую ее, или выбрав ее в качестве отдельного компонента.
в некоторых прошлых версиях Visual Studio обновленные средства EF доступны для загрузки. сведения о том, как получить последнюю версию средств EF, доступных для вашей версии Visual Studio, см. в статье Visual Studio версии .
Использование PowerShell для проверки минимальной версии
Используйте команды PowerShell, чтобы проверить значение записи выпуска для подраздела HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full .
2 ответа 2
Проблема с дублирующимся первичным ключом возникает когда, сюрприз, первичный ключ дублируется. Вы значение ключа не указали, там лежит ноль - вот EF и пытается вставить этот ноль в таблицу три раза.
Вообще говоря, такое поведение по умолчанию - странное. Потому что EF умеет использовать автоинкрементные ключи, и свойство Id по умолчанию становится именно таковым.
Есть несколько предположений почему так может происходить.
Наиболее вероятно, что вы используете подход Database First, то есть вы сгенерировали модель по готовой базе данных. И в этой базе данных атрибут Id не был объявлен автоинкрементным (в терминах MS SQL Server - Identity). Сделайте его автоинкрементным и обновите модель.
За создание автоинкрементных полей в EF отвечает соглашение StoreGeneratedIdentityKeyConvention . Но оно работает только с типами Int16, Int32 и Int64 (они же - short, int и long). Возможно, ваше свойство Id имеет какой-то другой тип данных. В таком случае исправьте его на long и все заработает.
Также возможно, что EF по какой-то причине не использует соглашение StoreGeneratedIdentityKeyConvention. Это возможно если оно было явно удалено из списка используемых соглашений на этапе построения модели. Проверьте, нет ли у вас в классе контекста метода OnModelCreating с непонятными строчками.
Также на всякий случай привожу полный список условий, которые должны быть выполнены для того чтобы первичный ключ автоматически стал автоинкрементным:
- Сущность должна быть корнем иерархии (не должно быть базового класса, отображенного на БД).
- Эта иерархия не может быть типа TPC (Table per Concrete class)
- Первичный ключ должен состоять равно из одного свойства
- Это свойство должно быть типа Int16, Int32 или Int64
- У сущности не может быть других автоинкрементных свойств
- У ключевого свойства не должен быть явно указан никакой StoreGeneratedPattern
- Сущность не может разделять одну и ту же таблицу с другой сущностью
Существует возможность принудительно сделать свойство автоинкрементным ключом. Для этого надо использовать атрибут DatabaseGeneratedAttribute :
Тем не менее, условия из списка выше взялись не просто так, и лучше добиться их выполнения чем вот так давить силой - иначе могут "полезть" уже другие ошибки.
В своих попытках решить такую элементарную на первый взгляд задачу, как разработка минимального демонстрационного приложения WinForms с использованием EF Core в VisualStudo 2015 я натолкнулся на целый проблем типа исключений, неожиданного поведения, непонимания как сделать нечто, что в туториалах подразумевается как самоочевидное и т.п. В результате некоторые шаги из тех, что я приведу ниже пришлось нащупывать практически в слепую, гугля, задавая вопросы и экспериментируя.
3. Обновляем расширение Visual Studio для работы с репозиториями NuGet. Для этого либо скачиваем актуальную на данный момент версию 3.5.0.1996 по прямой ссылке либо добавляем в настройки Visual Studio соответствующий репозиторий расширений для автоматического обновления.
5. Нажимаем правой кнопкой мыши по нашему проекту в панели Solution Explorer, выбираем Manage NuGet Packages. переходим на вкладку Browse, устанавливаем Microsoft.EntityFrameworkCore.Sqlite.Design и Microsoft.EntityFrameworkCore.Tools. Для установки актуальных версий может потребоваться установить галочку «Include prerelease», в стабильных версиях может чего-то не хватать или наличествовать неисправленные баги. Я установил последние на данный момент Microsoft.EntityFrameworkCore.Sqlite.Design 1.1.0 и Microsoft.EntityFrameworkCore.Tools 1.1.0-preview4-final. Если возникнут проблемы с установкой Microsoft.EntityFrameworkCore.Tools можно попробовать сделать это через командную строку NuGet: в меню выбрать Tools — NuGet Package Manager — Package Manager Console, в появившейся консоли (которая, кстати, ещё понадобится нам далее) после приглашения «PM>» ввести «Install-Package Microsoft.EntityFrameworkCore.Tools -Pre»
6. Создаём файлы исходного кода классов модели данных. Для порядка я поместил их в подпапку «Model» (некоторые называют её «Entities», некоторые кидают все классы в корень проекта, а некоторые и вовсе в один файл). Модель описывает учебный пример базы данных, хранящей список городов и людей в/из них. Каждый человек может быть связан только с одним городом, может быть неизвестно из какого он города вообще.
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext.cs
7. Разрешаем скрипты PowerShell, если этого не сделать может возникнуть ошибка ". \packages\Microsoft.EntityFrameworkCore.Tools.1.1.0-preview4-final\tools\init.ps1 cannot be loaded because running scripts is disabled on this system." Для этого переходим в командную строку NuGet (выбрать Tools — NuGet Package Manager — Package Manager Console в меню) и выполняем следующую команду
8. Создаём «миграции». Для этого, сохранив и откомпилировав наш код (просто чтобы удостовериться в отсутствии явных опечаток) переходим в командную строку NuGet и выполняем следующую команду.
в результате у нас в проекте должна появиться папка «Migrations» и два файла в ней: «Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.cs» и «20170304204355_Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs» (разумеется число в начале последнего у вас будет другое — это ни что иное, как дата и время в момент генерации в очевидном формате, я её потом вообще удалил оставив только «Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs»).
9. Редактируем сгенерированные файлы чтобы добавить условие уникальности (unique constraint, также известное как вторичный ключ) на имя города (в реальности, конечно, бывают города с одинаковыми именами, но для примера будет не лишним)
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.cs
10. Генерируем файл БД. Для этого в командной строке NuGet выполняем следующую команду
Файл БД создастся в той же директории, где находится скомпилированный exe-шник нашего приложения, у меня это ". \Vs2015WinFormsEfcSqliteCodeFirst20170304Example\bin\Debug\Vs2015WinFormsEfcSqliteCodeFirst20170304Example.sqlite".
На данном этапе мы уже можем заглянуть внутрь созданного файла, например с помощью официального консольного клиента sqlite3 или бесплатной кроссплатформенной GUI оболочки DB Browser for SQLite, и удостовериться, что таблицы создались корректно. Помимо наших таблиц «Cities» и «People» мы также найдём там таблицу «__EFMigrationsHistory» со служебной информацией EF Core и «sqlite_sequence» со служебной информацией SQLite.
11. Теперь перейдём к дизайнеру нашей формы, разместим на ней кнопочку, щёлкнем и на ней дважды чтобы создать обработчик события нажатия на кнопку и перейти к редактированию его кода. Ниже привожу свой код, демонстрирующий основные действия с записями БД. Я ещё имею привычку всегда переименовывать Form1 в MainForm и контролы аналогично по смыслу (в данном случае единственный контрол button1 в mainButton), но это дело вкуса и принятых в вашей команде стандартов именования.
Разумеется в реальной жизни вы реализуете в приложении более богатый интерфейс, более осмысленную логику, добавите обработку исключений и валидацию данных для их предотвращения, приведённого же примера достаточно для понимания того, как это сделать.
Модуль PowerShell 2.0.
Подраздел NET Framework Setup в пути реестра не начинается с точки.
установка пакета EF NuGet
вы можете установить пакет EntityFramework, щелкнув правой кнопкой мыши папку references проекта и выбрав пункт управление пакетами NuGet.
Среда выполнения EF
последняя версия Entity Framework доступна в качестве пакета NuGet EntityFramework. если вы не знакомы с NuGet диспетчер пакетов, рекомендуем ознакомиться с NuGet обзором.
установка из консоли диспетчер пакетов
кроме того, можно установить EntityFramework, выполнив следующую команду в консоли диспетчер пакетов.
Установка последней предварительной версии
Приведенные выше методы предоставляют последнюю полностью поддерживаемую версию Entity Framework. Часто доступны предварительные версии Entity Framework, которые мы будем рады получить, и поделитесь с нами.
чтобы установить последнюю предварительную версию EntityFramework, можно выбрать параметр включить предварительные выпуски в окне управление пакетами NuGet. Если предварительные версии недоступны, вы автоматически получите последнюю версию Entity Framework, полностью поддерживаемую.
кроме того, можно выполнить следующую команду в консоли диспетчер пакетов.
The project's target framework does not contain Entity Framework runtime assemblies. Please review the target framework information on the project's property page.
Steps to reproduce:
The error appears:
Отправка запросов в реестр с помощью кода
RegistryKey.OpenBaseKeyиспользуйте методы и RegistryKey.OpenSubKey для доступа к подразделу RegistryKey.OpenBaseKey в реестре Windows.
Добавьте директиву using Microsoft.Win32 или Imports Microsoft.Win32 в начало файла кода, если вы еще этого не сделали.
Этот пример выводит данные, подобные следующим:
В этом примере применяются рекомендации для проверки версии:
- Проверяется, имеет ли параметр Release значение, большее или равное значению известных разделов выпуска.
- Проверка выполняется с самой последней до самой ранней версии.
Подраздел NET Framework Setup в пути реестра не начинается с точки.
Версия платформы | Подраздел реестра | Значение |
---|---|---|
1.0 | хклм\софтваре\микрософт\. NETFramework\Policy\v1.0\3705 | Установка REG_SZ равно |
1,1 | Setup\NDP\v1.1.4322 Framework HKLM\Software\Microsoft\NET | Установка REG_DWORD равно |
2.0 | Setup\NDP\v2.0.50727 Framework HKLM\Software\Microsoft\NET | Установка REG_DWORD равно |
3.0 | Setup\NDP\v3.0\Setup Framework HKLM\Software\Microsoft\NET | Инсталлсукцесс REG_DWORD равно |
3,5 | Setup\NDP\v3.5 Framework HKLM\Software\Microsoft\NET | Установка REG_DWORD равно |
Клиентский профиль 4.0 | Setup\NDP\v4\Client Framework HKLM\Software\Microsoft\NET | Установка REG_DWORD равно |
Полный профиль 4.0 | Setup\NDP\v4\Full Framework HKLM\Software\Microsoft\NET | Установка REG_DWORD равно |
Установка определенной версии EF
Обратите внимание, что представляет конкретную версию EF для установки. Например, 6.2.0 — это версия Number для EF 6,2.
Минимальная версия
Использование редактора реестра
В меню Пуск выберите Выполнить, введите regedit и нажмите кнопку ОК.
(Для запуска программы regedit необходимы учетные данные администратора.)
Поиск версий CLR
Инструмент Clrver.exe
Для определения версий среды CLR, установленных на компьютере, можно использовать средство CLR Version (Clrver.exe). откройте Visual Studio Командная строка разработчика или Visual Studio Developer PowerShell и введите .
Класс
Выполните запрос к свойству Environment.Version, чтобы получить объект Version.
Возвращенный объект System.Version указывает версию среды выполнения, в которой в настоящее время выполняется код. Он не содержит версий сборок или других версий среды выполнения, которые установлены на компьютере.
Получив объект Version, выполните к нему запрос:
Для основного идентификатора выпуска (например, 4 для версии 4,0) используйте свойство.
Для дополнительного идентификатора выпуска (например, 0 для версии 4,0) используйте свойство.
Для всей строки версии (например, 4.0.30319.18010) используйте метод. Он возвращает одно значение, соответствующее версии среды выполнения, в которой выполняется код. Он не возвращает версий сборок или других версий среды выполнения, которые установлены на компьютере.
В следующем примере свойство Environment.Version используется для получения сведений о версии среды CLR:
Использование редактора реестра (более ранние версии платформы)
В меню Пуск выберите Выполнить, введите regedit и нажмите кнопку ОК.
Для запуска программы regedit необходимы учетные данные администратора.
Запрос реестра с помощью кода (более ранние версии платформы)
Microsoft.Win32.RegistryKeyиспользуйте класс для доступа к подразделу Microsoft.Win32.RegistryKey в реестре Windows.
В этом примере отобразятся выходные данные, аналогичные следующим:
Читайте также: