【问题标题】:.Net Core 2.1 Web and Console DbContexts.Net Core 2.1 Web 和控制台 DbContexts
【发布时间】:2018-11-16 03:00:34
【问题描述】:

我在提问时不以我的清晰度而闻名,所以请原谅我,我也没有接受过任何正式培训,但我很难过。

我正在从 .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--

错误是 An Object refrence is required for the non-static field,metho or property Program._db

DbModel 在 Data/ApplicationDbContext.cs 中为 IIS App 定义,如下

public ApplicationDbContext(DbContextOptions<ApplicationDbContext>
options)
            : base(options)
         {
         }

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

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

【问题讨论】:

  • 发生了什么?你有例外吗?
  • 所以Core有不同的配置模型。您至少应该发布配置上下文和构造函数的位置。真正漂亮的是使用 DI,但对于现有应用程序来说可能太多了。
  • 我已经更新了原来的问题,希望能更清楚
  • 它不是升级。 ASP.NET Core MVC 不是 ASP.NET MVC 的新版本,它是一个全新编写的框架。您只能迁移到 ASP.NET Core,不能升级到它。它不像更改少数软件包并期望它能够工作那么容易。

标签: c# entity-framework asp.net-core .net-core


【解决方案1】:

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

ASP.NET Core 对所有内容都使用依赖注入,因此 EF Core 的 DbContext设计为依赖注入。在这方面,它不再使用开箱即用的默认构造函数,这就是您的旧代码失败的原因(这取决于是否存在默认构造函数)。

无论长短,做正确的事并注入您的上下文。您似乎正在尝试根据您的更新执行此操作。但是,您不能注入像 Program 这样的东西。这是您的应用程序的入口点,这意味着实际上什么都不存在。如果您查看您的网络应用程序,您会注意到Program 在那里设置了网络主机构建器(使用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);

这与在网络应用程序中执行所有这些操作相同,因此您可以添加您喜欢的任何类型的配置。

【讨论】:

  • 嗨,克里斯。感谢您的详细帖子,我想我会试一试并好好学习。我以前的(使用),有问题的代码是继承的,我只是继续他们以前所做的,我根本没有接受过代码开发方面的培训,但我到那里很慢。我会报告我的发现。
  • 不要挑错帮助别人,你能改一下 o.UseSqlServer("connection string")); o.UseSqlServer("connection string")) 额外的;
  • 接受答案有 3 个原因,1 它做了我需要的,2 我学到了一些东西,3,很多其他的和平只是点击在一起。谢谢克里斯和其他人:-)
  • @Mark:很好。固定。
猜你喜欢
  • 1970-01-01
  • 2018-11-26
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多