这篇文章主要讲解了“如何正常配置EF Core操作Oracle”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何正常配置EF Core操作Oracle”吧!
若要使用EF Core操作Oracle数据库,首先需要安装Oracle.EntityFrameworkCore。可以直接在NuGet上直接搜索安装即可。
按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入“11”代表11g,传入“12”代表12c。
public class MyContext : DbContext
{
public MyContext(DbContextOptions options) : base(options)
{ }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseOracle(
"DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;"
, b => b.UseOracleSQLCompatibility("12")); //指定数据库版本
}
}
如果我们在调试期间希望EF Core输出执行的Sql,我使用的方式自定义一个日志类,将Sql输出到Console中。
并在配置时将其注册进去。
1 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 2 { 3 //配置数据库连接 4 optionsBuilder.UseOracle( 5 "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;" 6 , b => b.UseOracleSQLCompatibility("12")); 7 //配置Sql输出控制台 8 var loggerFactory = new LoggerFactory(); 9 loggerFactory.AddProvider(new EFLoggerProvider());10 optionsBuilder.UseLoggerFactory(loggerFactory);11 12 base.OnConfiguring(optionsBuilder);13 }
由于是演示Demo,我们在开发ASP.NET Core项目时一般都是使用依赖注入来注册。如果使用依赖注入的写法,可以这样写。
services.AddDomainContext(builder =>
{
//配置数据库连接
builder.UseOracle(
"DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;"
, b => b.UseOracleSQLCompatibility(version));
//配置Sql输出控制台
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new EFLoggerProvider());
builder.UseLoggerFactory(loggerFactory);
});
在执行查询时,需要注意的有两点,一是Table映射的实体类的属性名称如果不显式指定的话需要使用全大写的形式,不然会报错“ORA-00904:标识符无效”。因为生成的Sql中是将所有的字段名都用双引号修饰的,而Oracle中存储字段名默认都是采用全大写的形式的。
所以如果我们不想将实体类所有的属性名称写成大写,就需要显式的指定映射的column的名称。可以使用DataAnnotations的特性标注所有属性,或者在Context中指定列映射。另外如果执行查询时需要指定Schema,也像下面这样配置。
方法1:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//判断当前数据库是Oracle
if (this.Database.IsOracle())
{ //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置
modelBuilder.HasDefaultSchema("XUHY");
}
modelBuilder.Entity<Employee>(entity =>
{
entity.ToTable("EMPLOYEE");
entity.Property(e => e.Id).IsRequired(); 12 //列映射
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY");
entity.Property(e => e.Department).HasColumnName("DEPARTMENT");
entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO");
entity.Property(e => e.IsValid).HasColumnName("ISVALID");
entity.Property(e => e.Name).HasColumnName("NAME");
});
base.OnModelCreating(modelBuilder);
}
方法2:
[Table("EMPLOYEE ")] //指定数据库对应表名
public class Employee
{
[Key] //主键
[Column("ID")] //指定数据库对应表栏位名称
public long Id { get; set; }
[Column("EMPLOYEENO")]
public int EmployeeNo { get; set; }
[Column("NAME")]
public string Name { get; set; }
[Column("BIRTHDAY")]
public DateTime BirthDay { get; set; }
[Column("DEPARTMENT")]
public string Department { get; set; }
[Column("ISVALID")]
public bool IsValid { get; set; }
}
经过上面的这些配置,便可以正常的执行数据的查询了。
await using var context = new MyContext(options);
var employeeCollection = await context.Employee.AsNoTracking().ToListAsync();
//var employeeCollection = await context.Employee.OrderBy(e => e.EmployeeNo).AsNoTracking().Skip(0).Take(5).ToListAsync();//分页
foreach (var employee in employeeCollection)
{
Console.WriteLine($"{employee.Name} | {employee.EmployeeNo} | {employee.Department}");
}
Console.ReadLine();
插入数据倒是和其他数据库差别不大,但是由于Oracle天生是没有自增Id的,如果我们设计的表的主键需要采用自增键就需要使用Sequence代替。在这种情况下就需要为实体类的主键指定Sequence的名称了。
modelBuilder.Entity<Employee>(entity => { entity.ToTable("EMPLOYEE"); entity.Property(e => e.Id).IsRequired(); //!!!指定需要关联的序列名称!!! entity.Property(e => e.Id).UseHiLo("SEQ_EMPLOYEE_ID"); //列映射 entity.Property(e => e.Id).HasColumnName("ID"); entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY"); entity.Property(e => e.Department).HasColumnName("DEPARTMENT"); entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO"); entity.Property(e => e.IsValid).HasColumnName("ISVALID"); entity.Property(e => e.Name).HasColumnName("NAME"); });
随后便可以执行插入数据了。
var employee = new Employee()
{
EmployeeNo = 6,
Name = "老周",
Department = "d6",
BirthDay = DateTime.Now.AddYears(-40),
IsValid = true
};
await using var context = new MyContext(options);
var res = await context.Employee.AddAsync(employee);
await context.SaveChangesAsync();
Console.WriteLine("添加成功");
Console.ReadLine();
以上就是简单总结的使用EF Core操作Oracle数据库时的一些比较特别的地方,当然本人仍在探索实践中,如有新发现也会抽空更新上来。
感谢各位的阅读,以上就是“如何正常配置EF Core操作Oracle”的内容了,经过本文的学习后,相信大家对如何正常配置EF Core操作Oracle这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/xuhy0826/blog/4953150