我正在Udemy上有关ASP.NET MVC的Mosh Hamedani课程之一。
在使用代码优先(实体框架)设计数据库时遇到一个错误。
起初,我收到错误“在程序集中未找到DbContext” 。解决了这个问题后,又有一个人突然冒出来。
下面的图像将向您显示添加迁移时发现的错误。我已经搜索了相同的错误,但没有成功。在过去的两个小时里,我一直在努力,但是到目前为止,仍然没有解决任何问题。
无法创建类型为“ Vidly_Context”的对象。有关设计时支持的不同模式,请参见https://go.microsoft.com/fwlink/?linkid=851728
答案 0 :(得分:15)
1-确保将您的网络项目设置为设置为启动项目
2-在 Package Manager控制台中,将数据访问层(如果有)设置为默认项目
3-然后再次运行命令
答案 1 :(得分:8)
该错误消息指出无法在设计时创建上下文。如果在迁移命令中使用--startup-project标志(或-s)指定启动项目,则可以帮助该命令在设计时创建上下文实例,其方式类似于在运行时创建该实例。 / p>
例如:
cd ./project_with_migrations_folder
dotnet ef --startup-project ../my_startup_project_path/ migrations add myMigration01
答案 2 :(得分:6)
我遇到了同样的问题。 OP提到他们需要将代码添加到其Startup.cs中。
在https://go.microsoft.com/fwlink/?linkid=851728上有以下代码示例;
staging
我的代码在我的ConfigureServices方法中缺少以下内容;
master
在为我的数据库上下文添加此选项后,问题已解决。
答案 3 :(得分:4)
我收到此错误是因为我的appsettings.json中缺少逗号
{
"ConnectionStrings": {
"DefaultCoonection": "Data Source=Leonardo-Notebook;Initial Catalog=MyDB;Integrated Security=True"
} <- Comma missing here
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
答案 4 :(得分:2)
在Startup文件的ConfigureServices方法中
services.AddDbContextPool<contextName>(
options => options.UseSqlServer(Configuration.GetConnectionString("conString")));
答案 5 :(得分:1)
使用.NET Core 3.1
将DbContext放置在单独的类库中后,出现此错误。
最终解决方案看起来像这样,它是从原始应用程序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))
{
}
答案 6 :(得分:1)
如果您使用的是经过正确身份验证的数据库服务器(例如Azure SQL DB),请检查是否在连接字符串中用服务器密码替换了Password={your_password}
。
答案 7 :(得分:0)
当EF Core代码首次在同时包含MVC项目和Blazor项目的.NET Core 3解决方案中迁移时,我遇到了这个问题。
如果将解决方案的启动项目设置为Blazor项目,则在使用add-migration
时会收到错误消息,但是如果将启动项目设置为MVC项目,则不会。
通过阅读documentation page linked to by the error message并比较两个项目的startup.cs文件中的代码,我不确定为什么会这样,但是暂时将启动项目切换为MVC项目可以为我解决。 / p>
答案 8 :(得分:0)
这是ASP.NET Core遇到的最荒谬的问题之一。我不太确定您提到的课程,但是如果您的应用程序像我的应用程序那样将表示层与数据层隔离开来;确保您在表示层上也“您的启动项目”中安装了最新版本的Microsoft.EntityFrameworkCore.Design。它是必需的,并且错误消息对此没有说明。
答案 9 :(得分:0)
这并不是框架的真正问题,而是构建应用程序的方式。例如,如果您使用DI并将WebApi(或MVC项目)与数据访问层分开,则会发生这种情况,因为当您尝试添加迁移时,上下文无法找到您要的连接字符串试图注入(这实际上是我的情况)。
在GitHub上找到了很好的解释:
这绝对不是应用程序问题,而是此存储库中的问题范围,但是 无论如何,我会尽力为您提供一些指导。
您会收到此错误,因为要生成迁移,您需要:
具有默认构造函数(即无参数构造函数)的DbContext
能够从ApplicationServices中获取DbContext(即依赖注入)
一个设计时工厂,它返回正确配置的DbContext。
由于ApplicationDbContext构造函数具有一个参数,因此必须使用选项2或3。请参见文章中的详细信息:https://docs.microsoft.com/ef/core/miscellaneous/cli/dbcontext-creation
但是选项2(最初使用的选项)不再起作用,因为更改了程序启动以改善日志记录。
而且,由于没有用于ApplicationDbContext的DesignTimeFactory,因此您现在将无法创建迁移。
如果您想了解这种创建迁移的方法,可以:
创建一个类似于CatalogContextDesignFactory>或IntegrationEventLogContextDesignTimeFactory的ApplicationDbContextDesignTimeFactory,或 尝试使用已经具有DesignTimeFactory的其他微服务,例如Catalog.API。
答案 10 :(得分:0)
如果启动项目使用ASP.NET Core Web主机或.NET Core通用主机,则这些工具会尝试从应用程序的服务提供程序获取DbContext对象,否则,您可以从设计时工厂创建DbContext({ {3}})。
答案 11 :(得分:0)
就我而言,我将 appsettings.development.json 文件设为强制性文件,但未创建该文件。如果您没有创建特定于环境的设置文件,请将其设置为可选:true
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工具可以进行迁移。作为一种在项目启动中定位任何其他错误的机制,可以在启动的各个行中添加控制台消息。在尝试迁移时,您甚至可以使用控制台检查诸如连接字符串之类的appsetting值。
Console.WriteLine("I can see this because the app was able to proceed this far.");