首页 > 其他分享 >EF Core设计时 DbContext 创建

EF Core设计时 DbContext 创建

时间:2024-04-03 23:44:48浏览次数:16  
标签:Core EF 应用程序 DbContext NET public 构造函数

设计时 DbContext 创建

本文内容
从应用程序服务
使用不带参数的构造函数
从设计时工厂
Args
某些 EF Core Tools 命令(例如 Migrations 命令)要求在设计时创建派生的 DbContext 实例,以便收集有关应用程序实体类型及其如何映射到数据库架构的详细信息。 在大多数情况下,由此创建的 DbContext 的配置方式最好与其在运行时的配置方式类似。

这些工具试图以多种方式创建 DbContext:

从应用程序服务
如果启动项目使用 ASP.NET Core Web 主机或 .NET Core 泛型主机,则这些工具将尝试从应用程序的服务提供程序获取 DbContext 对象。

这些工具首先尝试通过调用 Program.CreateHostBuilder()、调用 Build(),然后访问 Services 属性来获取服务提供程序。

C#

复制
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();

// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}

public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}

public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
备注

创建新的 ASP.NET Core 应用程序时,默认包括此挂钩。

DbContext 本身及其构造函数中的任何依赖项都需要在应用程序的服务提供程序中注册为服务。 这可以通过在 DbContext 上有一个以 DbContextOptions<TContext> 的实例为参数的构造函数,并使用 AddDbContext<TContext> 方法来轻松实现。

使用不带参数的构造函数
如果无法从应用程序服务提供程序获得 DbContext,则这些工具将查找项目中的派生 DbContext 类型。 然后,它们尝试使用不带参数的构造函数创建实例。 如果 DbContext 是使用 OnConfiguring 方法配置的,则这可以是默认构造函数。

从设计时工厂
还可以通过实现 Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> 接口来告知工具如何创建 DbContext:如果在与派生的 DbContext 相同的项目中或在应用程序的启动项目中找到实现此接口的类,则这些工具会绕过创建 DbContext 的其他方式,转而使用设计时工厂。

C#

复制
public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
public BloggingContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");

return new BloggingContext(optionsBuilder.Options);
}
}
如果需要在设计时以不同于运行时的方式配置 DbContext,如果 DbContext 构造函数采用未在 DI 中注册的附加参数,如果你根本不使用 DI,或者如果你出于某种原因不希望在 ASP.NET Core 应用程序的 Main 类中使用 CreateHostBuilder 方法,则设计时工厂可能特别有用。

Args
IDesignTimeDbContextFactory<TContext>.CreateDbContext 和 Program.CreateHostBuilder 都接受命令行参数。

可通过这些工具指定以下参数:

.NET Core CLI
Visual Studio
.NET CLI

复制
dotnet ef database update -- --environment Production
-- 标记指示 dotnet ef 将后面的所有内容都视为参数,而不要试图将它们解析为选项。 dotnet ef 未使用的任何额外参数都会转发到应用。

标签:Core,EF,应用程序,DbContext,NET,public,构造函数
From: https://www.cnblogs.com/zy8899/p/18113729

相关文章

  • defer 延迟调用【GO 基础】
    〇、前言在Go语言中,defer是一种用于延迟调用的关键字。defer在Go语言中的地位非常重要,它是确保资源正确释放和程序健壮性的关键字。本文将通过示例对其进行专门的详解。一、defer简介defer的主要用途是在函数执行完毕之前,确保某个操作被执行。通常用于:资源的释放管......
  • EF Core异步编程
    异步编程本文内容异步LINQ运算符客户端异步LINQ运算符当在数据库中执行查询时,异步操作可避免阻止线程。对于在富客户端应用程序中保持响应式UI,异步操作很重要,还可以增加Web应用程序中的吞吐量,从而释放线程来为Web应用程序中的其他请求提供服务。按照.NET标准,EFCore......
  • EF Core 高效更新
    高效更新本文内容批处理在相关情况下使用ExecuteUpdate和ExecuteDelete批处理EFCore通过在一次往返中自动将所有更新批处理在一起,帮助最大限度地减少往返。考虑以下情况:C#复制varblog=context.Blogs.Single(b=>b.Url=="http://someblog.microsoft.com");blog.Url......
  • 关于vue项目在使用vuex的时候,this.$store报错undefined的问题
    vue.runtime.esm.js?c320:4605[Vuewarn]:Errorinrender:"TypeError:Cannotreadpropertiesofundefined(reading'state')。这个问题的主要原因是vuex的版本高于vue的版本。如果vue使用2.XX,vuex的版本要低于4.XX."dependencies":{"axios":"^1.6......
  • Codeforces Round 937 (Div. 4) D题(无脑做法)
    D.ProductofBinaryDecimals题目:提示:首先如果该数目都是1和0组成那肯定输出yes了,还有这个数如果是二进制的乘积也可以yes现在举个例子看看121=11x1114641=11x11x11x11显然也是yes,但是要如何做呢,下面介绍无脑做法。AC代码#include<bits/stdc++.h>usingnamespace......
  • 【教程】宝塔default.db占用空间几十g解决方法|宝塔占用磁盘空间特别大解决方法|宝塔
    目录一、前言二、排查问题三、解决方法一、前言用过宝塔创建网站,大家应该都非常熟悉,但是用随着用的时间越来越多,宝塔所占用的空间也越来越多,不停的加大数据盘都没有用,我原先买了30G够用了,随着时间一长,发现数据盘又满了,不得不又买了20个G扩容,可是过了一段时间又满了。......
  • [转]Docker部署Firefox容器,实现远程浏览器查看内网服务,如登录路由器配置页面等
    类似的镜像很多人都做过,找了一个start数比较多的jlesage/firefox,这个在github上有详细使用说明,我使用docker-compose.yml文件内容如下:version:'3'services:firefox:container_name:firefoximage:jlesage/firefoxports:-"5800:5800"volu......
  • FlinkSQL Unable to create a source for reading table 'default_catalog.default_da
    问题描述使用FlinkSql的jdbc连接器读取mysql的一张表,总是提示 Exceptioninthread"main"org.apache.flink.table.api.ValidationException:Unabletocreateasourceforreadingtable'default_catalog.default_database程序代码publicstaticvoidmai......
  • Codeforces Round 901 (Div. 2) E
    链接有些部分和常规的题目有很大的区别,所以我理解的过程产生的很大很大的障碍。我看了4天吧,这题和题解。好烦。我的第一个思路就是暴力。因为很明显,其实对于每一个二进制位,a,b,m的情况数量是很有限的,就只有8种,而相应的,c,d的对应位是由这4种位运算得到的。我先尝试对每一种情况看......
  • 【Redis】.Net Core 面试破冰
    目录1.Redis简介2.使用场景3.C#具体使用介绍(Nuget)StackExchange.RedisFreeRedisNewLife.RedisServiceStack.Redis(收费)4.Redis常用面试问题以及回答5.建议及经验分享建议Redis经验分享ShareFlow1.Redis简介Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持......