❤️ 关注 Furion 微信公众号有惊喜哦!
🫠 遇到问题了
Skip to main content
⭐️ 开通 VIP 服务仅需 499 元/年,尊享 365 天项目无忧23 立即开通23 ⭐️
特别赞助

9.1 入门简要

9.1.1 入门准备

入门条件

EF/EFCore 有一定基础了解,还未接触的可先看 【EFCore 基础】

9.1.1.1 安装对应数据库包

tip

在本章节所在的类别中,所有数据库操作功能均需要依赖 EntityFramework Core 框架,但 Furion 框架底层并未集成 EntityFramework Core 包,而是采用动态加载程序集方式自动载入。

所以,如需使用本大类数据库功能,需安装对应的 EntityFramework Core 数据库包:

  • SqlServerMicrosoft.EntityFrameworkCore.SqlServer (支持 SqlServer 2005 +)
  • SqliteMicrosoft.EntityFrameworkCore.Sqlite
  • CosmosMicrosoft.EntityFrameworkCore.Cosmos
  • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
  • MySql
    • Pomelo.EntityFrameworkCore.MySql:(支持 MySql 5.x +)
    • MySql.EntityFrameworkCore:支持 (MySql 8.x +)
  • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
  • OracleOracle.EntityFrameworkCore (支持 Oracle 10 +)
  • FirebirdFirebirdSql.EntityFrameworkCore.Firebird
  • DmMicrosoft.EntityFrameworkCore.Dm
小知识

这些数据库包应该安装在 YourProject.EntityFramework.Core 层。特殊情况需安装在 YourProject.Core 层中,如 Mysql HasCharset() 配置。

9.1.1.2 创建数据库上下文

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;

namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext>
{
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}
}
}
特别注意

每一个数据库上下文都需继承 AppDbContext<TDbContext, TDbContextLocator> 基类,默认数据库的 TDbContextLocatorMasterDbContextLocator,无需显式编写。

非默认数据库则需显式继承并申明,如:AppDbContext<OtherDbContext, OtherDbContextLocator>

想了解更多可查阅 【数据库上下文定位器】 章节。

9.1.1.3 配置连接字符串

Furion 框架提供多种方式配置数据库连接字符串:

  • appsettings.json 中配置
{
"ConnectionStrings": {
"Sqlite3ConnectionString": "Data Source=./Furion.db"
}
}
  • 自定义 .json 文件配置
{
"ConnectionStrings": {
"Sqlite3ConnectionString": "Data Source=./Furion.db"
}
}

该方式和在 appsettings.json 的区别是自定义的 .json 文件不会自动添加到项目中,须在 Visual Studio 中配置 .json 右键属性,设置 复制 输出目录为 如果较新则复制,生成操作为:内容

  • [AppDbContext] 特性配置
[AppDbContext("Data Source=./Furion.db", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext>
{
}
  • 在注册上下文时配置
services.AddDatabaseAccessor(options =>
{
// options.AddDb<DefaultDbContext>(connectionMetadata: "配置Key或连接字符串");
options.AddDbPool<DefaultDbContext>(connectionMetadata: "配置Key或连接字符串");
});
  • DbContext 中配置
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;

namespace Furion.EntityFramework.Core
{
public class DefaultDbContext : AppDbContext<DefaultDbContext>
{
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("连接字符串");
base.OnConfiguring(optionsBuilder);
}
}
}

9.1.1.4 各类数据库连接字符串配置示例

  • SqliteData Source=./Furion.db
  • MySqlData Source=localhost;Database=Furion;User ID=root;Password=000000;pooling=true;port=3306;sslmode=none;CharSet=utf8;
  • SqlServerServer=localhost;Database=Furion;User=sa;Password=000000;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;
  • OracleUser Id=orcl;Password=orcl;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))
  • PostgreSQLPORT=5432;DATABASE=postgres;HOST=127.0.0.1;PASSWORD=postgres;USER ID=postgres;

9.1.1.5 注册数据库上下文

Furion.EntityFramework.Core\Startup.cs
using Furion.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

namespace Furion.EntityFramework.Core
{
[AppStartup(600)]
public sealed class FurEntityFrameworkCoreStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 配置数据库上下文,支持N个数据库
services.AddDatabaseAccessor(options =>
{
// 配置默认数据库
options.AddDbPool<DefaultDbContext>();

// 配置多个数据库,多个数据库必须指定数据库上下文定位器
// options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>();
});
}
}
}
了解更多数据库数据库注册方式

如需了解各种数据库及版本注册方式可查阅 【9.19 多数据库注册章节

9.1.1.6 Code First 说明

特别注意

Furion 框架默认数据迁移的程序集为:Furion.Database.Migrations,所以如果您改了程序集名称或通过 NuGet 方式安装的 Furion 包,则需要配置迁移程序集名称:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<DefaultDbContext>(DbProvider.Sqlite);
}, "存放迁移文件的项目名称");

另外,如果应用中配置了多个数据库上下文,那么所有的 迁移命令 都需要指定 -Context 数据库上下文名称 参数。如:

Add-Migration v1.0.0 -Context DefaultDbContext

9.1.2 反馈与建议

与我们交流

给 Furion 提 Issue