簡體   English   中英

.Net Core 2.1 Web和控制台DbContext

[英].Net Core 2.1 Web and Console DbContexts

我在問問題時不太清楚我的名字,所以請原諒我,我也沒有接受任何正式的培訓,但是我很沮喪。

我是從.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);
}

就像我從數據庫中獲得我想要的數據一樣,butttt您認為我可以使用Core 2.1做到這一點嗎?

我已經將所有代碼都移植了下來,所有的參考文件都已解決,據我所知,它已經可以運行了。 除非我無法從數據庫調用數據並陷入困境,否則google只顯示代碼優先和ef的東西,或者我不知道im真正在問什么。

因此,如果有人可以幫助它,我們將不勝感激

-更新1 ---

錯誤是非靜態字段,方法或屬性Program._db要求對象刷新

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

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();
        }
    }

您以前編寫代碼( using )的方式從來都不是一個好主意。 您的上下文應在請求范圍內; 使用using會導致實體跟蹤出現各種問題,並完全破壞EF所做的所有有用的緩存。 獲取上下文實例的最佳方法始終是通過DI容器進行依賴項注入。

ASP.NET Core對所有內容都使用依賴項注入,因此,由於EF Core的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();
    }
}

現在,僅基於此處的代碼,這有點矯kill過正。 您可以通過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應用程序中進行的所有操作相同,因此您可以添加所需的任何類型的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM