一. 新功能(变化)
前置
参考官方文档:https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-5.0/whatsnew
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-5.0/breaking-changes
映射实体:Scaffold-DbContext "Server=.;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entity -UseDatabaseNames -DataAnnotations -NoPluralize
1. 直接将查询语句输出到控制台
在OnConfiguring中直接配置 optionsBuilder.LogTo(Console.WriteLine); 详见CoreConsole
PS:有点鸡肋,不如之前写法好用。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.LogTo(Console.WriteLine); }
2. 灵活的实体映射
实体类型通常映射到表或视图,以便 EF Core 在查询该类型时将拉回表或视图的内容。 EF Core 5.0 添加了其他映射选项, 其中可将实体映射到 SQL 查询(称为“定义查询”)或表值函数 (TVF):
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Post>().ToSqlQuery( @"SELECT Id, Name, Category, BlogId FROM posts UNION ALL SELECT Id, Name, ""Legacy"", BlogId from legacy_posts"); modelBuilder.Entity<Blog>().ToFunction("BlogsReturningFunction"); } -------- protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>().ToTable("Blogs").ToView("BlogsView"); }
3. DbContextFactory 和 PooledDbContextFactory
EF Core 5.0 引入了 AddDbContextFactory 和 AddPooledDbContextFactory 来注册工厂,以便在应用程序的依赖项注入 (D.I.) 容器中创建 DbContext 实例;
注:当应用程序代码需要手动创建和处理上下文实例时,这很有用。
代码分享:
public void ConfigureServices(IServiceCollection services) { //工厂注入 services.AddDbContextFactory<EFDB01Context>(b => b.UseSqlServer(Configuration.GetConnectionString("EFStr"))); //services.AddPooledDbContextFactory<EFDB01Context>(b => b.UseSqlServer(Configuration.GetConnectionString("EFStr"))); services.AddControllersWithViews(); }
使用:
/// <summary> /// 测试 DbContextFactory 注入,然后手动创建上下文实例 /// </summary> public class Test1Controller : Controller { private readonly IDbContextFactory<EFDB01Context> _contextFactory; public Test1Controller(IDbContextFactory<EFDB01Context> contextFactory) => _contextFactory = contextFactory; public IActionResult Index() { using (var context = _contextFactory.CreateDbContext()) { var data = context.T_UserInfor.ToList(); } return View(); } }