数据库连接字符串

在 ASP.NET Core 添加配置片段:

{

"ConnectionStrings": {

"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"

}

}

然后,配置对应的DbContext:

public void ConfigureServices(IServiceCollection services)

{

services.AddDbContext(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(

options => options.UseSqlServer(

"",

providerOptions => providerOptions.EnableRetryOnFailure()));

}

你也可以自定义执行策略:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

optionsBuilder

.UseMyProvider(

"",

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 options)

: base(options)

{ }

public DbSet Blogs { get; set; }

}

也可以通过OnConfiguring方法进行配置:

public class BloggingContext : DbContext

{

public DbSet 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(options => options.UseSqlite("Data Source=blog.db"));

}

避免多线程操作

EF Core 提供了async/await操作,但是这是一个语法糖,它并不支持并行操作,这是由于数据库连接的特性限制的,因此我们应避免针对同一个Context执行任何并行操作。

参考文档

参考微软 EF Core 使用文档,详情:

ef core mysql 字符集,EF Core 基础知识相关推荐

  1. MySQL增删改查基础知识

    前几天学习了MySQL数据库的一些基础知识,了解了后台数据库的一些基础的数据操作:增删改查,对于项目前后台的数据传递有了些概念,总结了一些MySQL的基础语法. 一.数据存储形式发展和数据库作用 根据 ...

  2. mysql注释符号_MySQL基础知识(2021最新版教程)

    一.MySQL简介 MySQL是一种开放源代码的关系型数据库管理系统,使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. MySQL是开放源代码的,因此任何人都可以在General ...

  3. mysql和foxbase_Mysql使用基础知识和MYSQL数据库的简单操作 -(转)

    Mysql使用基础知识 有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令. 一.连接MYSQL.格式:my ...

  4. Mysql(一)——基础知识

    Mysql 一.数据库简介 二.计算机存储字符 三.约束和自增 1.列约束 2.自增列 一.数据库简介 1.存储数据的方式有哪些 特定文件/内存/第三方云服务器/数据库服务器 2.什么是数据库 数据库 ...

  5. mysql 完整性概念_mysql基础知识

    mysql 表 查询语句 DQL :查询语句 排序查询语法:order by 子句 排序方式:ASC : 升序,默认的 DESC : 降序. 注意 :如果有多个排序条件,则当前边得条件值一样时,才会判 ...

  6. mysql latid1_MySQL触发器的基础知识分享

    说明: MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序,是MySQL 5版本新增的功能. 本文介绍: 触发器的类型和基本使用方法,讲述了触发器使用中容易产生的误区,从MySQL源码中 ...

  7. mysql中需要提交的操作_MySQL常用操作及基础知识

    原标题:MySQL常用操作及基础知识 1.启动和关闭mysql服务器: service mysql start service mysql stop 2.重启MySQL服务: service mysq ...

  8. mysql 隐藏中间四位_MySQL知识体系——索引

    本文直切主题,针对InnoDB引擎描述索引及优化策略.在开始之前,需要读者了解: 二叉查找树(包括2-3查找树.红黑树等数据结构) MySQL的InnoDB引擎基础知识 索引初探 要了解索引,当然要了 ...

  9. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...

    简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.IO ...

最新文章

  1. 【SCOI 2009】生日快乐
  2. 比较有意思的比较内表的小函数
  3. 深入理解WEB请求过程
  4. 在批处理文件中启动MediaPlayer播放制定文件
  5. 2.Cannot find config.m4.
  6. iis如何处理并发请求
  7. WORD如何将标题编号设置为汉字编号?
  8. java开发者最常去的20个英文网站
  9. 【代码笔记】Web-JavaScript-JavaScript 运算符
  10. Java编写简易的代码生成器
  11. Louvain 算法的核心思路以及数据结构(最完善版)
  12. 手机浏览器上网谁最快?手机浏览器速度测评
  13. 商业百科——最具公关营销价值的商业百科平台
  14. 分油问题回朔法c语言算法,用回溯法求“韩信分油”问题所有解
  15. C++:char数组初始化
  16. OAI-PMH:元数据获取标准
  17. 2D转换缩放效果(10)
  18. ROS学习:tf坐标系
  19. SSCoin交易开放时间及未来价值
  20. linux批量文件处理,Linux一行命令处理批量文件

热门文章

  1. Zbrush2021写实人物肖像雕刻学习教程
  2. L1-023 输出GPLT (C++解决,含题解)
  3. TCP/IP 协议栈4层结构及3次握手4次挥手
  4. [Linux] 029 脚本安装包
  5. spring boot jpa 整合
  6. JS document
  7. CGpoint,CGSize,CGRect,NSRange
  8. -bash:syntax error near unexpected token '('
  9. 浏览器加载、解析、渲染的过程
  10. 172. Factorial Trailing Zeroes