我在提问时不清楚我的清晰度,所以请原谅我,我也没有接受任何正式培训但是我很难受。
我正在从.Net 4.7.1升级到.Net Core 2.1,我的解决方案由两部分组成,一个用于MVC的IIS Web应用程序和一个控制台应用程序,IIS应用程序显示数据,控制台应用程序完成所有操作实际处理。
在我为我的控制台应用程序启动此端口之前,当我需要数据库中的内容时,我只需
using (var db = new ApplicationDbContext())
{
SomethingModel model = db.X.First(x => x.Whatever == whatever);
}
就像我拥有数据库中我想要的数据一样,但你觉得我能用Core 2.1做到这一点我可以吗。
我将所有代码移植到所有解析的代码中,并且我可以告诉它准备运行。除了我不能从数据库中调用数据并且难以接受,谷歌只是首先显示代码和ef的东西,或者我不知道我真正在问什么。
所以,如果有人可以帮助它非常赞赏
- 更新1 ---
错误是非静态字段,方法或属性Program._db
需要对象引用DbModel在IIS App的Data / ApplicationDbContext.cs中定义,如下所示
public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options)
: base(options)
{
}
- Console App的Program.cs
class Program
{
private ApplicationDbContext _db { get; }
public Program(ApplicationDbContext context)
{
_db = context;
}
static void Main(string[] args)
{
new ExecutionEngine(_db).Run();
}
}
答案 0 :(得分:4)
您编写代码(using
)的先前方式是从不一个好主意。您的上下文应该是请求范围的;使用using
可以导致实体跟踪的各种问题,并完全破坏EF所做的所有有用的缓存。获取上下文实例的最佳方法始终是通过DI容器进行依赖注入。
ASP.NET Core对所有内容都使用依赖注入,并且因为这个EF Core DbContext
设计是依赖注入的。在这方面,它不再使用开箱即用的默认构造函数,这就是您的旧代码失败的原因(它取决于是否存在默认构造函数)。
长短,做正确的事并注入你的背景。看起来您尝试根据您的更新执行此操作。但是,你不能注入像Program
这样的东西。这是您的应用程序的入口点,这意味着什么都不存在。如果您查看您的Web应用程序,您会注意到Program
设置了Web主机构建器(使用Startup
),然后构建并运行它。在幕后,这是一堆东西,包括设置服务集合。这是您需要在控制台应用程序中执行的操作(设置服务集合)。这是相对直接的:
class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddDbContext<ApplicationDbContext>(o =>
o.UseSqlServer("connection string"))
.BuildServiceProvider();
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
new ExecutionEngine(context).Run();
}
}
现在,根据你在这里的代码,这有点过分。您可以通过DbContextOptionsBuilder
简单地新建一个上下文实例:
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseSqlServer("connection string")
.Options;
var context = new ApplicationDbContext(options);
但是,使用服务集合可以处理更高级的方案,并更好地重用代码库中的上下文等实例。另外值得一提的是,您应该考虑集成配置提供程序,这样您就不需要对连接字符串进行硬编码。这也是相对直截了当的:
var config = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json", optional: true)
.Build();
您可能还想添加特定于环境的配置:
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
然后:
.AddJsonFile($"appsettings.{environment}.json", optional: true);
这与在Web应用程序中执行此操作完全相同,因此您可以添加任何类型的配置。