9.1 入门简要
9.1.1 入门准备
对 EF/EFCore
有一定基础了解,还未接触的可先看 【EFCore 基础】
9.1.1.1 安装对应数据库包
在本章节所在的类别中,所有数据库操作功能均需要依赖 EntityFramework Core
框架,但 Furion
框架底层并未集成 EntityFramework Core
包,而是采用动态加载程序集方式自动载入。
所以,如需使用本大类数据库功能,需安装对应的 EntityFramework Core
数据库包:
SqlServer
:Microsoft.EntityFrameworkCore.SqlServer
(支持 SqlServer 2005 +)Sqlite
:Microsoft.EntityFrameworkCore.Sqlite
Cosmos
:Microsoft.EntityFrameworkCore.Cosmos
InMemoryDatabase
:Microsoft.EntityFrameworkCore.InMemory
MySql
Pomelo.EntityFrameworkCore.MySql
:(支持 MySql 5.x +)MySql.EntityFrameworkCore
:支持 (MySql 8.x +)
PostgreSQL
:Npgsql.EntityFrameworkCore.PostgreSQL
Oracle
:Oracle.EntityFrameworkCore
(支持 Oracle 10 +)Firebird
:FirebirdSql.EntityFrameworkCore.Firebird
Dm
:Microsoft.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>
基类,默认数据库的 TDbContextLocator
为 MasterDbContextLocator
,无需显式编写。
非默认数据库则需显式继承并申明,如: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 各类数据库连接字符串配置示例
Sqlite
:Data Source=./Furion.db
MySql
:Data Source=localhost;Database=Furion;User ID=root;Password=000000;pooling=true;port=3306;sslmode=none;CharSet=utf8;
SqlServer
:Server=localhost;Database=Furion;User=sa;Password=000000;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;
Oracle
:User Id=orcl;Password=orcl;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))
PostgreSQL
:PORT=5432;DATABASE=postgres;HOST=127.0.0.1;PASSWORD=postgres;USER ID=postgres;
9.1.1.5 注册数据库上下文
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。