.Net Core 2.1 Web和控制台DbContexts

时间:2018-06-06 12:14:48

标签: c# entity-framework asp.net-core .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);
}

就像我拥有数据库中我想要的数据一样,但你觉得我能用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();
        }
    }

1 个答案:

答案 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应用程序中执行此操作完全相同,因此您可以添加任何类型的配置。