EF Core 基础知识
数据库连接字符串
在 ASP.NET Core 添加配置片段:
{
"ConnectionStrings": {
"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
}
}
然后,配置对应的DbContext:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}
日志记录
EF Core 默认会与 ASP.NET Core的日志提供程序一起工作,只需要使用AddDbContext或AddDbContextPool添加服务即可。
除此之外,还可以手工添加日志记录。
首先,创建LoggerFactory的单例:
public static readonly LoggerFactory MyLoggerFactory
= new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});
然后,通过DbContextOptionsBuilder注册此单例:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
如果你只想记录想要的日志,例如数据操作语句,可以在ILoggerProvider中进行配置:
public static readonly LoggerFactory MyLoggerFactory
= new LoggerFactory(new[]
{
new ConsoleLoggerProvider((category, level)
=> category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information, true)
});
配置弹性连接
EF Core 可以根据不同的数据库失败,制定不同的执行策略,例如故障自动重试等。
针对SQL Server,它知道可以重试的异常类型,并且具有合理的默认值的最大重试,重试次数等之间的延迟。
配置如下:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;ConnectRetryCount=0",
options => options.EnableRetryOnFailure());
}
也可在Startup中配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PicnicContext>(
options => options.UseSqlServer(
"<connection string>",
providerOptions => providerOptions.EnableRetryOnFailure()));
}
你也可以自定义执行策略:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseMyProvider(
"<connection string>",
options => options.ExecutionStrategy(...));
}
自动重试与事物
对于执行自动重试策略来说,每一次调用context.SaveChanges()方法将会当做一个重试单元。如果你的事物中有多个SaveChanges操作,配置的自动重试策略将会抛出异常,解决方法是使用委托来手动调用执行策略。代码如下:
using (var db = new BloggingContext())
{
var strategy = db.Database.CreateExecutionStrategy();
strategy.Execute(() =>
{
using (var context = new BloggingContext())
{
using (var transaction = context.Database.BeginTransaction())
{
context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/dotnet"});
context.SaveChanges();
context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/visualstudio"});
context.SaveChanges();
transaction.Commit();
}
}
});
}
此方法同样适用于环境事物:
using (var context1 = new BloggingContext())
{
context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
var strategy = context1.Database.CreateExecutionStrategy();
strategy.Execute(() =>
{
using (var context2 = new BloggingContext())
{
using (var transaction = new TransactionScope())
{
context2.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
context2.SaveChanges();
context1.SaveChanges();
transaction.Complete();
}
}
});
}
自动重试策略需要考虑幂等性问题,防止数据添加重复等误操作。EF Core 引入了一种状态检查机制,可以帮助我们实现是否执行成功的检测:
using (var db = new BloggingContext())
{
var strategy = db.Database.CreateExecutionStrategy();
var blogToAdd = new Blog {Url = "http://blogs.msdn.com/dotnet"};
db.Blogs.Add(blogToAdd);
strategy.ExecuteInTransaction(db,
operation: context =>
{
context.SaveChanges(acceptAllChangesOnSuccess: false);
},
verifySucceeded: context => context.Blogs.AsNoTracking().Any(b => b.BlogId == blogToAdd.BlogId));
db.ChangeTracker.AcceptAllChanges();
}
DbContext配置项
DbContext必须有DbContextOptions实例能,Options的作用如下:
- 配置数据库提供程序
- 连接字符串
- 数据库提供程序级别的可选项
- EF Core级别的可选项
可以通过构造函数添加Options:
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
也可以通过OnConfiguring方法进行配置:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=blog.db");
}
}
使用依赖注入DbContext时,需要构造函数的方式进行配置,并在Startup中配置DbContext:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
}
避免多线程操作
EF Core 提供了async/await操作,但是这是一个语法糖,它并不支持并行操作,这是由于数据库连接的特性限制的,因此我们应避免针对同一个Context执行任何并行操作。
参考文档
参考微软 EF Core 使用文档,详情:
- https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-strings
- https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/logging
- https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-resiliency
- https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/configuring-dbcontext
EF Core 基础知识的更多相关文章
- ASP.NET Core 基础知识(四) Startup.cs类
ASP.NET Core应用程序需要一个启动类,按照约定命名为Startup.在 Program 类的主机生成器上调用 Build 时,将生成应用的主机, 通常通过在主机生成器上调用 WebHostB ...
- ASP.NET Core 基础知识(三) Program.cs类
ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...
- 001从零开始入门Entity Framework Core——基础知识
Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术. 一.什么是 Entity Framework Core ...
- ASP.NET Core 基础知识(五) 依赖关系注入
参考https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html 和 https://www.cnblogs.com/artech/p/net-c ...
- .net core 基础知识
1.IOC(转:https://www.cnblogs.com/artech/p/inside-asp-net-core.html) IoC的全名Inverse of Control,翻译成中文就是“ ...
- ASP.NET CORE 基础知识(一):概述【下】
此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...
- ASP.NET Core 基础知识(一) ASP.NET Core是什么?与.NET Framework、Mono之间的关系 ?
一.概念: ASP.NET Core 是一个开源的.跨平台的 .NET 实现.而 .NET Framework 是基于 Windows 的 .NET 实现,Mono 是 .NET Framework ...
- ASP.NET CORE 基础知识(一):概述【上】
此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 原文请参考MSDN ASP.NET Core. 这篇文章是 ...
- EF Core 的 Code First 模式
0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...
随机推荐
- HTTP 协议漫谈
转载出处:HTTP 协议漫谈 简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 HTTP 协 ...
- Spring中常见的设计模式——单例模式
一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...
- Java求吸血鬼数算法(通用)
/*吸血鬼数字是指位数为偶数的数字,可以由一 * 对数字相乘而得到,而这对数字各包含乘积的一半位数的数字, * 其中从最初的数字中选取的数字可以任意排序. * 以两个0结尾的数字是不允许的. * * ...
- 对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default
反编译或者.net用更高版本打开时会出现这个问题,解决办法如下: 1.网页版程序,将解决方案中的Web.config中的 /langversion 的值改为指定的值,既可以解决,我这里采用的是默认值, ...
- 01 JavaScript变量的声明、变量的使用、变量的命名规范和规则
变量的声明,关键字:var //声明一个变量 var name; //给变量赋值 name = '哈士奇'; //声明并赋值一个变量 var name = '哈士奇'; 变量的使用 //声明并赋值一个 ...
- 【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你
一.前言简述 因为最近微信读书出了网页版,加上自己也在闲暇的时候看了两本书,不禁好奇什么样的书更受欢迎,哪位作者又更受读者喜欢呢?话不多说,爬一下就能有个了解了. 二.页面分析 首先打开微信读书:ht ...
- Nginx负载均衡、SSL原理、生成SSL密钥对、Nginx配置SSL
6月12日任务 12.17 Nginx负载均衡12.18 ssl原理12.19 生成ssl密钥对12.20 Nginx配置ssl扩展 针对请求的uri来代理 http://ask.apelearn.c ...
- python-模块,异常,环境管理器
模块 Module 什么是模块: 1.模块是一个包含有一系列数据,函数,类等组成的程序组 2.模块是一个文件,模块文件名通常以.py结尾 作用: 1.让一些相关数据,函数,类等有逻辑的组织在一起,使逻 ...
- matlab实现PSNR
目录 1.PSNR原理 2.PSNR的matlab实现代码 3.针对彩色图像的PSNR的matlab代码 @ 1.PSNR原理 PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏, ...
- 一道随机函数题:由rand5()生成rand7()
题目:已知rand5()函数能随机等概率的生成0, 1, 2, 3, 4,利用rand5()函数编写一个rand7()函数实现相似的功能. 分析:其实就是利用rand5()组合成一个更大范围的数,之后 ...