Я следую одному из курсов Моша Хамедани по ASP.NET MVC в Udemy.
Я столкнулся с одной ошибкой при разработке моей базы данных с использованием кода (Entity Framework).
Сначала я получил ошибку "В сборке не найден DbContext". После решения этой проблемы из ниоткуда нахлынула другая.
На изображении ниже показана ошибка, обнаруженная при добавлении миграции. Я уже искал ту же ошибку, но тщетно. Я борюсь последние два часа, но до сих пор ничего не решено.
Пожалуйста, кто-нибудь, помогите мне. Спасибо![Не удалось создать объект типа «[Имя DBContext]». Для различных шаблонов, поддерживаемых во время разработки](https://i.stack.imgur.com/fYc4H.png)
unable to create an object of type 'Vidly_Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
Аналогичная проблема после добавления собственного конструктора DbContext с (2) параметрами. Приложение было в порядке, но миграции перестали работать. Исправлено 1-м обновлением EF (3.1.5 используется по странной причине при работе с 5) с использованием информации из Инструмент Dotnet @xspdf и заменой упомянутого конструктора на метод + жестко заданную строку подключения по умолчанию, если она не установлена.
dotnet tool update --global dotnet-ef
// following command show the most during migration build/run in cmd
// mind current dir is Migrations folder of (VS) startup project here
dotnet ef --startup-project ../ --verbose migrations add test
3.1.5 и ошибка активации контекста
The Entity Framework tools version '3.1.5' is older than that of the runtime '5.0.0'. Update the tools for the latest features and bug fixes.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider in assembly '...'...
Finding Microsoft.Extensions.Hosting service provider...
No static method 'CreateHostBuilder(string[])' was found on class 'Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext '...Context'.
Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type '...Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
---> System.InvalidOperationException: Unable to resolve service for type 'System.String' while attempting to activate '...'. (my additional parameter)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_4.<FindContextTypes>b__13()
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_4.<FindContextTypes>b__13()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Unable to create an object of type '...Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
Да, теперь он работает. Кусок кода C# должен был быть добавлен в файл запуска
@OoMaRjOhUr, вы можете добавить ответ, показывающий, какой код вы добавили, чтобы это заработало, а затем принять этот ответ. Это может помочь кому-то в будущем.
Да, почему бы @OoMaRjOhUr не добавить ответ, чтобы остальные могли его увидеть?
Попробуйте запустить приложение в режиме отладки и посмотрите, выдает ли приложение исключение до того, как dbcontext будет внедрен в контейнер di. Была та же проблема, вызванная запуском приложения перед «options.UseSqlServer (.)». Надеюсь, это поможет





Я столкнулся с этой проблемой при использовании миграции кода EF Core сначала в решении .NET Core 3, содержащем как проект MVC, так и проект Blazor.
Если у меня есть стартовый проект решения, установленный на проект Blazor, я получаю сообщение об ошибке при использовании add-migration, но я не получаю, если у меня есть стартовый проект, настроенный на проект MVC.
Из чтения страница документации, на которую ссылается сообщение об ошибке и сравнения кода в файлах startup.cs для обоих проектов я не уверен, почему это так, но временное переключение запускаемого проекта на проект MVC исправляет это для меня.
Может ли ваша проблема быть вызвана наличием ссылки на Microsoft.EntityFrameworkCore.Design в проекте MVC, но не в проекте Blazor? Я обнаружил, что это имело место в прошлом.
@PTD Я только что с большим опозданием попытался добавить эту ссылку, но это не помогло мне.
1- Убедитесь, что ваш веб-проект установлен как Сделать стартовым проектом
2- В Консоль диспетчера пакетов установите уровень доступа к данным (если есть) как проект По умолчанию.
3- Затем снова запустите команду
Стоит отметить, что если вы используете Rider, где у вас нет «Установить как запускаемый проект», вы можете использовать --startup-project в команде
Это вызывает ошибку «Ваш запускаемый проект «Web» не ссылается на Microsoft.EntityFrameworkCore.Design». Итак, что касается разделения задач, я не хочу, чтобы мой веб-проект знал об EF.....
У меня была совершенно другая проблема, которая привела к той же ошибке. Очень полезно запускать команду Add-Migration с флагом -verbose, чтобы понять, почему не удается создать миграцию. В моем случае это был отсутствующий пустой конструктор для DBContext.
Иногда это может быть и устаревшее оборудование.
@JHBonarius, ты нашел какое-нибудь решение для этого?
Я столкнулся с той же проблемой. ОП упомянул, что им нужно добавить код в свой Startup.cs.
На https://go.microsoft.com/fwlink/?linkid=851728 есть следующий пример кода;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
}
В моем коде отсутствует следующее в моем методе ConfigureServices;
services.AddDbContext<ApplicationDbContext>();
После добавления этого для моего контекста базы данных проблема была решена.
В файле StartUp метод ConfigureServices
services.AddDbContextPool<contextName>(
options => options.UseSqlServer(Configuration.GetConnectionString("conString")));
Я использую именно это, но все равно получаю ошибку
Я получил эту ошибку, потому что в моем файле appsettings.json отсутствовала запятая.
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=Leonardo-Notebook;Initial Catalog=MyDB;Integrated Security=True"
}, // <- Comma missing here
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
У меня была аналогичная проблема, чем эта. В качестве предложения убедитесь, что ваша программа работает или, по крайней мере, запускается, прежде чем пытаться исправить проблему «добавить-миграции».
В сообщении об ошибке говорится, что контекст не может быть создан во время разработки. Если вы укажете в команде миграции стартовый проект с флагом --startup-project (или -s), вы можете помочь команде создать экземпляр контекста во время разработки аналогично тому, как он будет создан во время выполнения.
Например:
cd ./project_with_migrations_folder
dotnet ef --startup-project ../my_startup_project_path/ migrations add myMigration01
Обновлено. Вторая команда является примером команды миграции с указанным флагом запуска проекта. Должен работать с любой командой миграции. IMO - лучший подход, чем существующие ответы, потому что он не требует изменения вашего кода.
Добавление --startup-project исправило это для меня, спасибо!
Это сделало это и для меня. Моя строка подключения находится в моем appsettings.json, который находится в моем основном проекте веб-API, который отделен от моего проекта данных (где живет dbcontext). Я выполнял миграцию dotnet ef, добавляя InitialCreate в свой проект данных, и произошел сбой из-за ошибки, о которой сообщалось в исходном сообщении. Как только я добавил --startup-project и путь к моему основному проекту веб-API, все заработало.
это одна из самых глупых проблем, с которыми вы когда-либо сталкивались при работе с ASP.NET Core. Я не совсем уверен в курсе, который вы упомянули, но если ваше приложение такое же, как мое, где уровень представления отделен от уровня данных; убедитесь, что вы установили последнюю версию Microsoft.EntityFrameworkCore.Design на свой уровень презентации, а также "ваш стартовый проект". Это требуется, и сообщение об ошибке ничего не говорит об этом.
Неясно это. Я пошел на этот вариант, и все было хорошо - спасибо.
Прежде чем получить указанную выше ошибку, я получил сообщение об ошибке, говорящее о том, что пакет Microsoft.EntityFrameworkCore.Design необходим на уровне API, так что это больше не так.
Я получил эту ошибку после помещения моего DbContext в отдельную библиотеку классов с помощью .NET Core 3.1.
Окончательное решение выглядело следующим образом: моя строка подключения была взята из исходных приложений appsettings.json:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace MyNamespace
{
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var optionsBuilder = new DbContextOptionsBuilder();
var connectionString = configuration
.GetConnectionString("DefaultConnection");
optionsBuilder.UseSqlServer(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
}
Затем я мог бы использовать это в своем другом проекте следующим образом:
var applicationDbContextFactory = new ApplicationDbContextFactory();
using (var dbContext = applicationDbContextFactory.CreateDbContext(args))
{
}
так что невозможно настроить dbcontext и строку подключения в файле настроек в библиотеке класса?
ты прав. в моем случае я просто комментирую строку «new ConfigurationBuilder () ...», и это работает.
На самом деле проблема не в фреймворке, а в том, как вы создали свое приложение. Например, если вы использовали DI и у вас был WebApi (или проект MVC), отделенный от вашего уровня доступа к данным, это произойдет с вами, потому что при попытке добавить миграцию ваш контекст не может найти строку подключения, которую вы пытаясь ввести (это на самом деле был мой случай).
Хорошее объяснение можно найти здесь на Гитхаб:
That's definitely not an app issue which is this scope of the issues in this repo, but I'll try to give you some guidance anyway.
You get that error because to generate migrations you need either:
A DbContext with a default constructor (that is, a parameterless constructor)
Being able to get the DbContext from ApplicationServices (that is, Dependency Injection)
A design time factory that returns a properly configured DbContext.
Since ApplicationDbContext constructor has a parameter, you have to use options 2 or 3. See the details in the article: https://docs.microsoft.com/ef/core/miscellaneous/cli/dbcontext-creation
But option 2 (the one originally used) doesn't work any more, because the program startup was changed to improve logging.
And, since there's no DesignTimeFactory for ApplicationDbContext you just won't be able to create migrations at this time.
If you want to learn about this way for creating migrations you can:
Create an ApplicationDbContextDesignTimeFactory, similar to CatalogContextDesignFactory > or IntegrationEventLogContextDesignTimeFactory, or Try with other microservice like Catalog.API, that already has its DesignTimeFactory.
Да, это был мой случай. Я добавил DI после миграции, и DbContext стал недоступен во время разработки. Решено путем создания DbContext без параметров путем перемещения параметров в метод OnConfigiring DbContext.
Если ваш запускаемый проект использует веб-узел ASP.NET Core или универсальный узел .NET Core, средства пытаются получить объект DbContext от поставщика услуг приложения, в противном случае вы можете создать DbContext из фабрики времени разработки (https://docs.microsoft.com/es-es/ef/core/miscellaneous/cli/dbcontext-создание).
В моем случае я сделал файл appsettings.development.json обязательным, но не создавал его. Если вы не создаете файл настроек для конкретной среды, установите его как необязательно: правда
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Но важно отметить, что ошибка может не обязательно относиться к DbContext и его конфигурациям. Это может быть какая-то другая ошибка при запуске вашего приложения, которая препятствует загрузке приложения, чтобы инструментарий EF мог выполнить миграцию. В качестве механизма обнаружения любой другой ошибки при запуске вашего проекта вы можете добавить консольное сообщение в различные строки файла Startup. Вы даже можете проверить значения параметров приложения, такие как строки подключения, с помощью консоли при попытке миграции.
Console.WriteLine("I can see this because the app was able to proceed this far.");
Если вы используете правильно прошедший проверку подлинности сервер базы данных, такой как Azure SQL DB, проверьте, заменяете ли вы Password = {your_password} паролем вашего сервера в строке подключения.
вы читали данную ссылку?