.Net Core 2.1 Web和控制台DbContext

Mar*_*ark 2 c# entity-framework .net-core asp.net-core

我在问问题时不太清楚我的名字,所以请原谅我,我也没有接受任何正式的培训,但是我很沮丧。

我正在从.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);
}
Run Code Online (Sandbox Code Playgroud)

就像我从数据库中获得我想要的数据一样,butttt您认为我可以使用Core 2.1做到这一点吗?

我已经将所有代码都移植了下来,所有的参考文件都已解决,据我所知,它已经可以运行了。除非我无法从数据库中调用数据并陷入困境,否则google只显示代码优先和ef的东西,或者我不知道im真正在问什么。

因此,如果有人可以帮助它,我们将不胜感激

-更新1 ---

错误是非静态字段,方法或属性Program._db要求对象刷新

DbModel在IIS App的Data / ApplicationDbContext.cs中定义,如下所示

public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options)
            : base(options)
         {
         }
Run Code Online (Sandbox Code Playgroud)

-控制台应用程序的Program.cs

 class Program
    {
        private ApplicationDbContext _db { get; }
        public Program(ApplicationDbContext context)
        {
            _db = context;
        }
        static void Main(string[] args)
        {
            new ExecutionEngine(_db).Run();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 5

您以前编写代码(using)的方式从来都不是一个好主意。您的上下文应在请求范围内;使用using会导致实体跟踪出现各种问题,并完全破坏EF所做的所有有用的缓存。获取上下文实例的最佳方法始终是通过DI容器进行依赖项注入。

ASP.NET核心使用依赖注入的一切,也正因为如此EF核心的DbContext设计用来依赖注入。在这方面,它不再使用默认的构造函数,这就是您的旧代码失败的原因(它取决于是否有默认构造函数)。

总而言之,把事情做好,注入自己的背景。您似乎正在尝试根据更新进行此操作。但是,您不能注入Program。这是您的应用程序的切入点,这实际上意味着还不存在。如果您看一下您的Web应用程序,您会注意到Program那里设置了Web Host Builder(使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,仅基于此处的代码,这有点矫kill过正。您可以通过以下命令简单地新建一个上下文实例DbContextOptionsBuilder

var options = new DbContextOptionsBuilder<ApplicationDbContext>()
    .UseSqlServer("connection string")
    .Options;
var context = new ApplicationDbContext(options);
Run Code Online (Sandbox Code Playgroud)

但是,使用服务集合可以使您处理更高级的场景,并更好地在整个代码库中重用诸如上下文之类的事物实例。另外值得一提的是,您可能还应该考虑集成配置提供程序,因此您无需对连接字符串进行硬编码。这也相对简单:

var config = new ConfigurationBuilder()
    .SetBasePath(Path.Combine(AppContext.BaseDirectory))
    .AddJsonFile("appsettings.json", optional: true)
    .Build();
Run Code Online (Sandbox Code Playgroud)

您可能还需要添加特定于环境的配置:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Run Code Online (Sandbox Code Playgroud)

然后:

.AddJsonFile($"appsettings.{environment}.json", optional: true);
Run Code Online (Sandbox Code Playgroud)

这与在Web应用程序中进行的所有操作相同,因此您可以添加所需的任何类型的配置。