[英].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.