EF Core 在实际开发中,如何分层?

这篇具有很好参考价值的文章主要介绍了EF Core 在实际开发中,如何分层?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

EF Core 在实际开发中,如何分层?

前言:什么是分层?

  1. 分层就是将 EF Core 放在单独的项目中,其它项目如 Asp.net core webapi 项目引用它
  2. 这样的好处是解耦和项目职责的清晰划分,并且可以重用 EF Core 项目
  3. 但是也会数据库迁移变得复杂起来

Step by step 步骤

  1. 创建一个 .NET 类库项目,项目名字为 BooksEFCore

  2. 引用以下 Nuget 包

    Microsoft.EntityFrameworkCore.Relational
    Microsoft.EntityFrameworkCore.SqlServer
    Microsoft.EntityFrameworkCore.Tools

  3. 创建实体类 Book

    // 把Book类声明为一个记录类,而不是普通的类,主要是为了让编译器自动生成ToString方法,简化对象的输出
    public record Book
    {
    	public Guid Id { get; set; }
    	public string Name { get; set; }
    	public double Price { get; set; }
    }
    
  4. 配置实体类

    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    
    class BookConfig : IEntityTypeConfiguration<Book>
    {
    	public void Configure(EntityTypeBuilder<Book> builder)
    	{
    		builder.ToTable("T_Books2");
    	}
    }	
    
  5. 创建上下文类【注意,这里有跟单体 EF Core 项目不一样的地方,看注释

    using Microsoft.EntityFrameworkCore;
    
    public class MyDbContext:DbContext
    {
    	public DbSet<Book> Books { get; set; }
    
    	//注意:
    	//在运行时通过读取配置来确定要连接的数据库
    	//不再重写 OnConfiguring 方法和在其中调用 UseSqlServer 等方法来设置要使用的数据库
    	//为 MyDbContext 类增加了 DbContextOptions<MyDbContext> 类型参数的构造方法
    	//DbContextOptions 是一个数据库连接配置对象,在 ASP.NET Core 项目中提供对 DbContextOptions 的配置
    	public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    	{
    
    	}
    
    	
    	protected override void OnModelCreating(ModelBuilder modelBuilder)
    	{
    		base.OnModelCreating(modelBuilder);
    		modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    	}
    }	
    
  6. 创建一个 Asp.net core webapi 项目,命名为 "EFCore测试用WebAPI项目1"

  7. 引用 EF Core 类项目 BooksEFCore

  8. 打开 appsettings.json 文件并添加数据库连接字符串配置

    {
      "Logging": {
    	"LogLevel": {
    	  "Default": "Information",
    	  "Microsoft.AspNetCore": "Warning"
    	}
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
    	"Default": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }	
    
  9. 打开 Program.cs 文件,注册数据库上下文服务

    using Microsoft.EntityFrameworkCore;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    
    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    // 注册数据库上下文服务
    // 使用AddDbContext方法来通过依赖注入的方式让MyDbContext采用指定的连接字符串连接数据库。
    // 由于AddDbContext方法是泛型的,因此可以为同一个项目中的多个不同的上下文设定连接不同的数据库。
    builder.Services.AddDbContext<MyDbContext>(opt =>
    {
    	string connStr = builder.Configuration.GetConnectionString("Default")!;
    	opt.UseSqlServer(connStr);
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
    	app.UseSwagger();
    	app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();	
    
  10. 创建 TestController 控制器,编写数据库读写的测试代码

    using Microsoft.AspNetCore.Mvc;
    
    [ApiController]
    [Route("[controller]/[action]")]
    public class TestController : ControllerBase
    {
    	private readonly MyDbContext dbCtx;
    
    	/// <summary>
    	/// 用依赖注入的形式来创建上下文
    	/// </summary>
    	/// <param name="dbCtx"></param>
    	public TestController(MyDbContext dbCtx)
    	{
    		this.dbCtx = dbCtx;
    	}
    
    	[HttpPost]
    	public async Task<long> Save()
    	{
    		dbCtx.Add(new Book { Id = Guid.NewGuid(), Name = "零基础趣学C语言", Price = 59 });
    		await dbCtx.SaveChangesAsync();
    		return dbCtx.Books.LongCount();
    	}
    }
    
  11. 生成实体类的迁移脚本

    1. 回到 EF Core 类项目 BooksEFCore

    2. 新建一个实现 IDesignTimeDbContextFactory 接口的类 MyDesignTimeDbContextFactory

      using Microsoft.EntityFrameworkCore;
      using Microsoft.EntityFrameworkCore.Design;
      
      //在多项目的环境下执行 EF Core 的数据库迁移有很多特殊的要求
      //容易出错,因为数据库连接在其它项目中
      //可以通过 IDesignTimeDbContextFactory 接口来解决这个问题
      //当项目中存在一个 IDesignTimeDbContextFactory 接口的实现类的时候,
      //数据库迁移工具就会调用这个实现类的 CreateDbContext 方法来获取上下文对象,
      //然后迁移工具会使用这个上下文对象来连接数据库
      //此代码只用于开发环境
      //生产环境可以去掉此代码
      class MyDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
      {
      	public MyDbContext CreateDbContext(string[] args)
      	{
      		DbContextOptionsBuilder<MyDbContext> builder = new();
      		string connStr = "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true";
      		//也可以从环境变量或者其它配置文件中读取,如下:
      		//string connStr = Environment.GetEnvironmentVariable("ConnectionStrings:BooksEFCore");
      		builder.UseSqlServer(connStr);
      		return new MyDbContext(builder.Options);
      	}
      }
      
    3. 设置 BooksEFCore 为启动项目

    4. 打开 菜单-工具-Nuget包管理-程序包管理器控制台,并选中 BooksEFCore

    5. 执行 Add-Migration Init 命令生成数据库迁移脚本

    6. 然后执行 Update-database 命令即可完成数据库的创建文章来源地址https://www.toymoban.com/news/detail-821399.html

扩展

  1. 在进行项目开发时,推荐采用 "小上下文" 策略
  2. "小上下文" 策略特点是:
    • 把关系紧密的实体类放到同一个上下文类中,把关系不紧密的实体类放到不同的上下文类中
    • 也就是项目中存在多个上下文类,每个上下文类中只有少数几个实体类
    • 有点 DDD 的味道
  3. "小上下文" 策略的好处:
    • 一个上下文实例初始化的时候,实体类的配置等过程将非常快,其不会成为性能瓶颈
    • 如果启用了数据库连接池,数据库连接的创建也不会成为性能瓶颈。

到了这里,关于EF Core 在实际开发中,如何分层?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【EF Core】实体的主、从关系

    假设有以下两个实体: Homework 类表示家庭作业,它并不是独立使用的,而是与学生类(Student)有依赖关系。一位学生有多个家庭作业记录,即 Homework 对象用于记录每位同学的作业的。按照这样的前提,Student 是主对象,Homework 是从对象。 Student 对象有个 Homeworks 属性,用于引

    2024年02月11日
    浏览(48)
  • Net Core中使用EF Core连接Mysql数据库

    Entity Framework Core的前身是微软提供并主推的ORM框架,简称EF,其底层是对ADO.NET的封装。EF支持SQLServer、MYSQL、Oracle、Sqlite等所有主流数据库。 首先是使用时的几个模式的整理及其理解: Code First:根据代码自动创建数据库表结构甚至是数据库,可以支持多库开发,代码较少冗余

    2024年01月24日
    浏览(52)
  • EF Core + MySQL 基本增删改查

    基于EF Core + MySQL的基本增删改查,示例是基于.NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移项目基础上的内容增加。同时也是对基于Canal实现MySQL 8.0 数据库数据同步项目的验证。 Controllers----添加----控制器,选择api----包含读写操作的API控制器。 将上下文类注入到User

    2024年02月08日
    浏览(51)
  • 使用EF Core创建webapi接口(二)

    有错误欢迎大家给我指正 说明:netcore webapi+net6+EF Core版本,codefirst模式(代码创建数据库) 1.netcore webapi+net6+EF Core版本,dbfirst模式(代码生成数据库)见:使用EF Core创建webapi接口(一)-CSDN博客 2.netcore webapi+net6+EF Core+vue前后端联动版本,见netcore webapi+net6+EF Core+vue3前后端联动-CSD

    2024年02月21日
    浏览(44)
  • Ef Core花里胡哨系列(4) 多租户

    当然,我们要考虑设计问题,例如,切换 Schema 或者改变数据库时, Ef Core 同样也会刷新改实体的缓存,所以,首次查询将会很慢,不适合大表。 在我的上一篇博客中 [Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户] 中我们实现了如何分表,同理,我们可以用近

    2024年02月03日
    浏览(37)
  • EF Core实操,数据库生成实体,迁移

    大家好,我是行不更名,坐不改姓的宋晓刚,下面将带领大家进入C#编程EF Core数据库基础入门知识,如何连接数据库,如何编写代码,跟上我的步伐进入EF Core数据库下的世界。 家人们,如果有什么不懂,可以留言,或者加我联系方式,一起进入微软技术的开拓。 微信:153

    2024年01月22日
    浏览(47)
  • EF Core预编译模型Compiled Model

    最近还在和 npgsql 与 EF Core 斗争,由于 EF Core 暂时还不支持 AOT,因此在 AOT 应用程序中使用 EF Core 时,会提示问题: 听这个意思,似乎使用 Compiled Model 可以解决问题,于是就又研究了一下 EF Core 的这个功能。 在 EF Core 中,模型根据实体类和配置构建,默认情况下,每次创建

    2024年02月05日
    浏览(44)
  • ASP.NET Core Web API入门之三:使用EF Core

    一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。 1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。 2、提升了开发效

    2024年02月10日
    浏览(55)
  • .NET6.0 EF Core连接sql

    1、先导入四个包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Relational Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools 2、在程序包管理控制台执行 Scaffold-DbContext \\\"server=.;Integrated Security=true;database=DBStu\\\" Microsoft.EntityFrameworkCore.SqlServer -OutPutDir Models Models是你实体类安放

    2024年02月06日
    浏览(52)
  • 试试这 6 个小技巧,提升 EF Core 性能

    Entity FrameWork(简称 EF)以面向对象的方式操作数据库给开发人员带来了很大的便利性,但其性能问题从面世以来就一直就被广大的 .NET 生态开发技术人员所吐槽,然而,它真的那么不堪使用吗?试试下面这 6 个小技巧,瞬间极大提升 EF Core 性能: AsNoTracking 在项目开发的时候

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包