数据库连接字符串

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

  1. {
  2. "ConnectionStrings": {
  3. "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  4. }
  5. }

然后,配置对应的DbContext:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<BloggingContext>(options =>
  4. options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
  5. }

日志记录

EF Core 默认会与 ASP.NET Core的日志提供程序一起工作,只需要使用AddDbContextAddDbContextPool添加服务即可。

除此之外,还可以手工添加日志记录。

首先,创建LoggerFactory的单例:

  1. public static readonly LoggerFactory MyLoggerFactory
  2. = new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});

然后,通过DbContextOptionsBuilder注册此单例:

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. => optionsBuilder
  3. .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
  4. .UseSqlServer(
  5. @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

如果你只想记录想要的日志,例如数据操作语句,可以在ILoggerProvider中进行配置:

  1. public static readonly LoggerFactory MyLoggerFactory
  2. = new LoggerFactory(new[]
  3. {
  4. new ConsoleLoggerProvider((category, level)
  5. => category == DbLoggerCategory.Database.Command.Name
  6. && level == LogLevel.Information, true)
  7. });

配置弹性连接

EF Core 可以根据不同的数据库失败,制定不同的执行策略,例如故障自动重试等。

针对SQL Server,它知道可以重试的异常类型,并且具有合理的默认值的最大重试,重试次数等之间的延迟。

配置如下:

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. {
  3. optionsBuilder
  4. .UseSqlServer(
  5. @"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;ConnectRetryCount=0",
  6. options => options.EnableRetryOnFailure());
  7. }

也可在Startup中配置:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<PicnicContext>(
  4. options => options.UseSqlServer(
  5. "<connection string>",
  6. providerOptions => providerOptions.EnableRetryOnFailure()));
  7. }

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

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. {
  3. optionsBuilder
  4. .UseMyProvider(
  5. "<connection string>",
  6. options => options.ExecutionStrategy(...));
  7. }

自动重试与事物

对于执行自动重试策略来说,每一次调用context.SaveChanges()方法将会当做一个重试单元。如果你的事物中有多个SaveChanges操作,配置的自动重试策略将会抛出异常,解决方法是使用委托来手动调用执行策略。代码如下:

  1. using (var db = new BloggingContext())
  2. {
  3. var strategy = db.Database.CreateExecutionStrategy();
  4. strategy.Execute(() =>
  5. {
  6. using (var context = new BloggingContext())
  7. {
  8. using (var transaction = context.Database.BeginTransaction())
  9. {
  10. context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/dotnet"});
  11. context.SaveChanges();
  12. context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/visualstudio"});
  13. context.SaveChanges();
  14. transaction.Commit();
  15. }
  16. }
  17. });
  18. }

此方法同样适用于环境事物:

  1. using (var context1 = new BloggingContext())
  2. {
  3. context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
  4. var strategy = context1.Database.CreateExecutionStrategy();
  5. strategy.Execute(() =>
  6. {
  7. using (var context2 = new BloggingContext())
  8. {
  9. using (var transaction = new TransactionScope())
  10. {
  11. context2.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
  12. context2.SaveChanges();
  13. context1.SaveChanges();
  14. transaction.Complete();
  15. }
  16. }
  17. });
  18. }

自动重试策略需要考虑幂等性问题,防止数据添加重复等误操作。EF Core 引入了一种状态检查机制,可以帮助我们实现是否执行成功的检测:

  1. using (var db = new BloggingContext())
  2. {
  3. var strategy = db.Database.CreateExecutionStrategy();
  4. var blogToAdd = new Blog {Url = "http://blogs.msdn.com/dotnet"};
  5. db.Blogs.Add(blogToAdd);
  6. strategy.ExecuteInTransaction(db,
  7. operation: context =>
  8. {
  9. context.SaveChanges(acceptAllChangesOnSuccess: false);
  10. },
  11. verifySucceeded: context => context.Blogs.AsNoTracking().Any(b => b.BlogId == blogToAdd.BlogId));
  12. db.ChangeTracker.AcceptAllChanges();
  13. }

DbContext配置项

DbContext必须有DbContextOptions实例能,Options的作用如下:

  • 配置数据库提供程序
  • 连接字符串
  • 数据库提供程序级别的可选项
  • EF Core级别的可选项

可以通过构造函数添加Options:

  1. public class BloggingContext : DbContext
  2. {
  3. public BloggingContext(DbContextOptions<BloggingContext> options)
  4. : base(options)
  5. { }
  6. public DbSet<Blog> Blogs { get; set; }
  7. }

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

  1. public class BloggingContext : DbContext
  2. {
  3. public DbSet<Blog> Blogs { get; set; }
  4. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  5. {
  6. optionsBuilder.UseSqlite("Data Source=blog.db");
  7. }
  8. }

使用依赖注入DbContext时,需要构造函数的方式进行配置,并在Startup中配置DbContext:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
  4. }

避免多线程操作

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

参考文档

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

EF Core 基础知识的更多相关文章

  1. ASP.NET Core 基础知识(四) Startup.cs类

    ASP.NET Core应用程序需要一个启动类,按照约定命名为Startup.在 Program 类的主机生成器上调用 Build 时,将生成应用的主机, 通常通过在主机生成器上调用 WebHostB ...

  2. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

  3. 001从零开始入门Entity Framework Core——基础知识

    Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术. 一.什么是 Entity Framework Core ...

  4. ASP.NET Core 基础知识(五) 依赖关系注入

    参考https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html 和 https://www.cnblogs.com/artech/p/net-c ...

  5. .net core 基础知识

    1.IOC(转:https://www.cnblogs.com/artech/p/inside-asp-net-core.html) IoC的全名Inverse of Control,翻译成中文就是“ ...

  6. ASP.NET CORE 基础知识(一):概述【下】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...

  7. ASP.NET Core 基础知识(一) ASP.NET Core是什么?与.NET Framework、Mono之间的关系 ?

    一.概念: ASP.NET Core 是一个开源的.跨平台的 .NET 实现.而 .NET Framework 是基于 Windows 的 .NET 实现,Mono 是 .NET Framework ...

  8. ASP.NET CORE 基础知识(一):概述【上】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 原文请参考MSDN ASP.NET Core. 这篇文章是 ...

  9. EF Core 的 Code First 模式

    0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...

随机推荐

  1. eNSP仿真软件之配置Trunk口

    实验原理 在以太网中,通过划分VLAN来隔离广播域和增强网络通信的安全性.以太网通常由多台交换机组成,为了使VLAN的数据帧跨越多台交换机传递,交换机之间互连的链路需要配置为干道链路(Trunk Li ...

  2. C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”

    “Microsoft.Jet.OLEDB.4.0” 是数据库接口驱动,用来连接数据库的,一般多用于连Access和Excel.我在在winform开发时,在本地运行没有问题,可是部署到另一台服务器上就 ...

  3. C++学习第二天(打卡)

    C++ new 可以很方便的 分配一段内存. 比如 int *test= new int ; int n; cin>>n; int * test =new int [n]; 可以实现动态分 ...

  4. 新闻实时分析系统-inux环境准备与设置

    1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...

  5. Spring Cloud Alibaba(五)RocketMQ 异步通信实现

    本文探讨如何使用 RocketMQ Binder 完成 Spring Cloud 应用消息的订阅和发布. 介绍 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的.高 ...

  6. 通过 Python 理解 Mixin 概念

    Mixin 的概念 Mixin 即 Mix-in,常被译为"混入",是一种编程模式,在 Python 等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组 ...

  7. Git实战指南----跟着haibiscuit学Git(第五篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  8. 教你如何提高 PHP 代码的质量

    说实话,在代码质量方面,PHP 的压力非常大.通过阅读本系列文章,您将了解如何提高 PHP 代码的质量. 我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系统缺乏适当的测试工具.在本文中 ...

  9. 分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数

    7月19日任务 20.27 分发系统介绍20.28 expect脚本远程登录20.29 expect脚本远程执行命令20.30 expect脚本传递参数 20.27 分发系统介绍 公司业务逐渐扩大时, ...

  10. 普通用户修改时间 sudo

    sudo date neokylinV7.0  desktop 1.给/etc/sudoers加权限 # chmod u+w /etc/sudoers 2.添加配置 # vim /etc/sudoer ...