分层项目使用EFCore
大约 2 分钟
分层项目使用EFCore
目的
- 实体项目只负责实体的创建和与数据库的映射
- 实体项目不维护具体数据库,数据库连接有 WebApi 项目配置
创建 EFCore 模型项目
创建类库项目,添加 EF Core 相关依赖,包括开发环境用到的数据库提供者依赖
创建实体类
Book
创建实体配置类
class BookEntityConfig : IEntityTypeConfiguration<Book>
- 配置数据库表名、映射、实体关系等
创建上下文类
class EntityDbContext : DbContext
- 供 WebAPI 项目调用数据表
- 配置 DbSet 属性
- 添加带
DbContextOptions
参数的构造函数public EntityDbContext(DbContextOptions<EntityDbContext> options) : base(options) { }
- 重写
OnModelCreating
方法引用实体配置类 - 不要重写
OnConfiguring
方法,连接字符串的配置交给 WebAPI
创建上下文工厂类
class BookDbContextFactory : IDesignTimeDbContextFactory<EntityDbContext>
用于开发时为对应的
DbContext
提供上下文实例由于其内部使用
new
创建上下文,因此,在WebAPI 中进行注入时不会调用到工厂类,而是直接向DbContext
的构造函数注入DbContextOptions
public class BookDbContextFactory : IDesignTimeDbContextFactory<EntityDbContext> { public EntityDbContext CreateDbContext(string[] args) { DbContextOptionsBuilder<EntityDbContext> builder = new DbContextOptionsBuilder<EntityDbContext>(); // 可以直接写,也可以从环境变量中导入,取决于连接字符串是否需要保密 string connStr = "Server=localhost\\SQLEXPRESS;Database=DemoDb;uid=root;pwd=123456;Encrypt=True;TrustServerCertificate=True;"; builder.UseSqlServer(connStr); return new EntityDbContext(builder.Options); } }
把 EFCore 项目设置为启动项目,执行 Migration 数据库迁移创建开发环境数据库
WebAPI 项目引用 EFCore 项目
添加项目引用
添加 WebAPI 项目使用的数据库提供者依赖包
在主程序中配置
DbContext
为 EFCore 项目注册用到的实体类上下文
builder.Services.AddDbContext<EntityDbContext>(opt => { // 生产环境连接字符串从配置文件获取 string connStr = "Server=localhost\\SQLEXPRESS;Database=DemoDb;uid=root;pwd=123456;Encrypt=True;TrustServerCertificate=True;"; opt.UseSqlServer(connStr); });
在
Controller
注入DbContext
public class BooksController : Controller { private EntityDbContext _entityDbCtx; public BooksController(EntityDbContext entityDbCtx) { _entityDbCtx = entityDbCtx; } [HttpGet] public ActionResult<Book?> Index(string name) { return _entityDbCtx.Books.FirstOrDefault(b => b.Name == name); } [HttpPost] public async Task<ActionResult<string>> Add([FromBody] Book book) { await _entityDbCtx.Books.AddAsync(book); var i = await _entityDbCtx.SaveChangesAsync(); return i > 0 ? "添加成功" : "添加失败"; } }