.NET Core 获取数据库上下文实例的方法和配置连接字符串
.NET Core 获取数据库上下文实例的方法和配置连接字符串
假设数据库就两个表:User、Blogs,
模型类如下
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Number { get; set; }
public string Email { get; set; }
}
public class Blogs
{
public int Id { get; set; }
public string BolgName { get; set; }
public string Url { get; set; }
}
数据库上下文大致这样
public class DataContext : DbContext
{
public DataContext()
{
}
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
public DbSet<User> Users { get; set; }
public DbSet<Blog> Blogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
/*
* 其他实现
*/
}
ASP.NET Core 注入
ASP.NET Core 的数据库注入是最为简单方便的了,在 ConfigureServices 配置即可。
services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));
然后在控制器等地方使用,不需要什么多余代码。
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly DataContext _context;
public WeatherForecastController(DataContext context)
{
_context = context;
}
}
.NET Core 注入
需要安装一个 Nuget 包
Microsoft.Extensions.DependencyInjection
创建一个类 ContextService,用来配置注入和获取上下文。
public class ContextService
{
/// <summary>
/// 配置各种服务
/// </summary>
/// <returns></returns>
public static IServiceProvider ServiceProvider()
{
IServiceCollection services = new ServiceCollection();
services.AddDbContext<DataContext>(options => options.UseSqlite("filename=Database.db"));
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
/// <summary>
/// 获取上下文
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static DataContext GetContext(IServiceProvider services)
{
var sqliteContext = services.GetService<DataContext>();
return sqliteContext;
}
/// <summary>
/// 获取上下文
/// </summary>
public static DataContext GetContext()
{
var services = ServiceProvider();
var sqliteContext = services.GetService<DataContext>();
return sqliteContext;
}
}
需要使用时可以这样获取上下文
var context = ContextService.GetContext();
var list = context.Users.ToList();
无签名上下文 OnConfigure 配置
上面两个示例中,连接字符串都是使用 Action<DbContextOptionsBuilder> optionsAction 来配置的。
options => options.UseSqlite("filename=Database.db")
我们可以直接在上下文的 OnConfigure 方法里,配置默认使用的连接字符串。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
#if DEBUG
optionsBuilder.UseSqlite("filename=Database.db");
#endif
}
但是,极其不建议这样做,一般可能调试环境或为了方便在里面这样做。
这种情况是上下文存在一个无签名构造函数时,外界使用此构造函数直接实例化上下文。
var context = new DataContext();
var list = context.Users.ToList();
这种情况下,是直接实例化上下文,并且使用默认的连接字符串。
OnConfiguring会在无注入、也没有使用有签名构造函数时才会生效,或者描述为多种配置上下文方式中优先级最低。
有签名上下文构造函数和自己new一个上下文
上下文必须具有 DbContextOptions 或 DbContextOptions<T> 的构造函数,建议使用泛型形式。
构造函数示例:
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
具有此构造函数,则可以通过外界注入配置,例如
services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));
如果你不使用注入(Microsoft.Extensions.DependencyInjection)或者第三方 ioc 工具,那么无法使用上面这种形式。
不过可以自己 new,自己传递配置对象,
var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
optionsBuilder.UseSqlite("filename=Database.db");
DataContext context = new DataContext(optionsBuilder.Options);
var list = context.Users.ToList();
工良比较菜。。。上面有很多原理没有弄懂,大神看到指定一下我呗~
.NET Core 获取数据库上下文实例的方法和配置连接字符串的更多相关文章
- .net Core 基于EF Core 实现数据库上下文
在做项目时,需要将某一些功能的实体建立在另一个数据库中,连接不同的数据库用以存储记录.通过查找资料,实现EF Core上下文. 下面是实现上下文后的解决方案的目录: 1.UpAndDownDbCont ...
- Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B
- EF Core 初始化数据库的两种方法。
使用DbContextSeed初始化数据库 添加链接字符串 // This method gets called by the runtime. Use this method to add serv ...
- ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用
与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的 ...
- ASP.NET Core 6框架揭秘实例演示[08]:配置的基本编程模式
.NET的配置支持多样化的数据源,我们可以采用内存的变量.环境变量.命令行参数.以及各种格式的配置文件作为配置的数据来源.在对配置系统进行系统介绍之前,我们通过几个简单的实例演示一下如何将具有不同来源 ...
- ASP.NET Core 6框架揭秘实例演示[09]:配置绑定
我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定.除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置 ...
- Asp.Net Core获取当前上下文对象
HttpContext简介 .Net Core中的HttpContext上下文是个抽象类,命名空间为Microsoft.AspNetCore.Http 所在程序集 \netstandard2.0\Mi ...
- Asp.Net Core获取请求上下文HttpContext
注:特别说明当前版本对应.Net Core2.1意义上框架 一.注入HttpContextAccessor ASP.NET Core中提供了一个IHttpContextAccessor接口,HttpC ...
- java中获取各种上下文路径的方法小结
一.获得都是当前运行文件在服务器上的绝对路径在servlet里用:this.getServletContext().getRealPath(); 在struts用:this.getServlet(). ...
随机推荐
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- SpringBoot中神奇的@Enable*注解?
在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@EnableAsync.@EnableScheduling等,今天我们就来分析 ...
- Beetlex服务框架之Webapi访问限制和url重写
在新版本的BeetleX.FastHttpApi中集成了IP访问策略和URL重写两个功能,通过IP访问策略可以制定服务针对不同IP的访问限制控制:而URL重写则可以制定更好的URL访问方式.以下介绍这 ...
- HDU 3873 Invade the Mars(带限制条件的Dijkstra)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路: 军队可以先等待在城市外面,等保护该城市的城市都被攻破后,直接进城(即进城不用耗费时间). ...
- Joomla3.4.6 RCE漏洞深度分析
笔者<Qftm>原文发布:https://www.freebuf.com/vuls/216512.html *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 0×00 背景 10月9 ...
- .NETCore下CI/CD之自动化测试
前言 为了呼应<中国.NET开发者峰会2019上海站>,作为演讲嘉宾,我希望和各位同行建立更多的互动,为此,我特地将部分演讲内容,整理成文章先行发布.本文从零开始,一步一步的引导,从安装J ...
- [转载]制作QT字库文件
原文地址:http://www.cnblogs.com/liu_xf/archive/2011/07/05/2098144.htm 摘要: QT4.7.0在移植到开发板上的时候,中文支持是必不可少的, ...
- Windows 10 + kali Linux 双系统安装教程(详细版)
准备工具如下: kali Linux 镜像 准备一4G以上的U盘 制作U盘启动盘工具- Win32DiskImager 添加引导工具-EasyBCD 留出一个空的盘,哪个盘的空间比较大可以压缩出大概2 ...
- Android 刷机方案
## 获取 在刷机之前,需要在电脑上下载 **Android Preview** 包,一般我都是到 [安卓中国](https://developer.android.google.cn/preview ...
- Linux 编译与交叉编译
在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文 ...