切换至EF Core Oracle Devart提供程序
本文档说明如何为 应用启动模板(默认预配置SQL Server提供程序)切换至Oracle数据库提供程序。
在切换提供程序前,请确保您的Oracle版本为v12.2+。早期Oracle版本存在标识符长度限制,无法创建超过30字节的数据库表、列或索引。自 v12.2 版本起,"标识符最大长度增加至128字节"。使用v12.2及更高版本时,可无障碍使用ABP提供的数据库表、列和索引。
替换Volo.Abp.EntityFrameworkCore.SqlServer包
解决方案中的.EntityFrameworkCore项目依赖 Volo.Abp.EntityFrameworkCore.SqlServer NuGet包。请移除该包并添加同版本的 Volo.Abp.EntityFrameworkCore.Oracle.Devart 包。
替换模块依赖
在.EntityFrameworkCore项目中找到您的项目名EntityFrameworkCoreModule类,从DependsOn特性中移除typeof(AbpEntityFrameworkCoreSqlServerModule),添加typeof(AbpEntityFrameworkCoreOracleDevartModule)。
同时将using Volo.Abp.EntityFrameworkCore.SqlServer;替换为using Volo.Abp.EntityFrameworkCore.Oracle.Devart;。
使用UseOracle()
在解决方案中找到所有UseSqlServer()调用,替换为UseOracle()。请检查以下文件:
.EntityFrameworkCore项目中的您的项目名EntityFrameworkCoreModule.cs.EntityFrameworkCore项目中的您的项目名DbContextFactory.cs
在您的项目名DbContextFactory.cs的CreateDbContext()方法中,将以下代码块:
var builder = new DbContextOptionsBuilder<YourProjectNameDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
替换为:
var builder = (DbContextOptionsBuilder<YourProjectNameDbContext>)
new DbContextOptionsBuilder<YourProjectNameDbContext>().UseOracle
(
configuration.GetConnectionString("Default")
);
根据解决方案结构的不同,您可能需要修改更多代码文件。
更改连接字符串
Oracle连接字符串与SQL Server不同。请检查解决方案中的所有appsettings.json文件并替换其中的连接字符串。Oracle连接字符串选项详情请参见 connectionstrings.com。
通常需要修改.DbMigrator和.Web项目中的appsettings.json,具体取决于您的解决方案结构。
重新生成迁移
启动模板默认使用 Entity Framework Core的Code First迁移 。EF Core迁移依赖于所选数据库管理系统提供程序。更换数据库提供程序后,现有迁移可能无法正常工作。
- 删除
.EntityFrameworkCore项目下的Migrations文件夹并重新构建解决方案 - 在程序包管理器控制台窗口中执行
Add-Migration "Initial"(在解决方案资源管理器中选择.DbMigrator(或.Web)项目作为启动项目,并在程序包管理器控制台中选择.EntityFrameworkCore项目作为默认项目)
这将为Oracle搭建新的迁移脚手架。
运行.DbMigrator项目以创建数据库、应用更改并填充初始数据。
修复ORA-12899: 列的值过大错误
创建迁移时,Oracle将字符串限制为NVARCHAR2(2000)。某些实体属性可能超出此限制。您可以检查ABP模块实体中已知且已报告的可能超出此限制的属性。为避免此问题,需要先将string类型转换为long类型并生成新迁移,然后将long类型转换为具有最大长度的clob类型。
第一次迁移
更新应用程序DbContext的OnModelCreating方法:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* 将模块包含到迁移数据库上下文中 */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("long").HasMaxLength(int.MaxValue);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("long").HasMaxLength(int.MaxValue);
});
/* 在此处配置您自己的表/实体 */
}
使用dotnet工具在解决方案的EntityFrameworkCore层创建新迁移:dotnet ef migrations add Oracle_Long_Conversion
第二次迁移
更新应用程序DbContext的OnModelCreating方法:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* 将模块包含到迁移数据库上下文中 */
builder.Entity<OpenIddictToken>(b =>
{
b.Property(q => q.Payload).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLog>(b =>
{
b.Property(x => x.Exceptions).HasColumnType("clob").HasMaxLength(4000);
});
builder.Entity<AuditLogAction>(b =>
{
b.Property(x => x.Parameters).HasColumnType("clob").HasMaxLength(4000);
});
/* 在此处配置您自己的表/实体 */
}
使用dotnet工具在解决方案的EntityFrameworkCore层创建新迁移:dotnet ef migrations add Oracle_Clob_Conversion
运行DbMigrator(或使用dotnet工具)迁移Oracle数据库。
运行应用程序
一切准备就绪。直接运行应用程序即可开始编码。
抠丁客


