EF Core + Oracle自动生成数据库
1、登录orcale 11g 授权
SQL> connect / as sysdba;
SQL> create user myuser identified by 123456;
SQL> grant connect, resource to myuser;
2、vs 2019 中新建EFcoreOracleTest,代码如下
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace ConsoleCoreTest
{
public class EFcoreOracleTest
{
public static void Test()
{
using var context = new MyContext();
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
Console.WriteLine("数据库创建成功");
var employeeadd = new Employee()
{
EmployeeNo = 100210,
Name = "zhangsan",
Department = "dept001",
BirthDay = DateTime.Now.AddYears(-40),
IsValid = true
};
var res = context.Set<Employee>().Add(employeeadd);
context.SaveChanges();
Console.WriteLine("添加成功");
var employeeCollection = context.Set<Employee>().ToList();
//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();
Console.ReadLine();
}
}
public class MyContext : DbContext
{
//public MyContext(DbContextOptions options) : base(options)
//{ }
//public MyContext() { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入“11”代表11g,传入“12”代表12c。
//optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;USER ID=evms;PASSWORD=123456;"
// , b => b.UseOracleSQLCompatibility("11")); //指定数据库版本
//注意:在使用Oracle的时候一定要先请DBA将账号建制好
//optionsBuilder.UseOracle(
// "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=orcl)));User Id=evms;Password=123456;"
// , b => b.UseOracleSQLCompatibility("11")); //指定数据库版本
optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;USER ID=my;PASSWORD=123456;"
, b => b.UseOracleSQLCompatibility("11")); //指定数据库版本
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//判断当前数据库是Oracle
if (Database.IsOracle())
{ //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置
//modelBuilder.HasDefaultSchema("EVMS");//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
modelBuilder.HasDefaultSchema("MY");//注意:DBA提供的数据库账号名称,必须大写
}
modelBuilder.Entity<Employee>(entity =>
{
entity.ToTable("EMPLOYEE");
entity.Property(e => e.Id).IsRequired();//列映射
//oracle没有自增主键,只能通过序列自增,ForOracleUseSequenceHiLo可以实现递增
//entity.Property(e => e.Id).HasColumnName("ID").ForOracleUseSequenceHiLo("EMPLOYEE_ID_SQ1");
//entity.Property(e => e.Id).UseHiLo("EMPLOYEE_ID_SQ1").HasColumnName("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");
});
//一旦打包到docker运行 就会查询不到数据,可能是时区有问题,在dockerfile中添加如下语句 在生成的时候 设置好时区:
//FROM microsoft/ dotnet:3.1 - aspnetcore - runtime
//ENV TZ = Asia / Shanghai
//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");
//});
base.OnModelCreating(modelBuilder);
}
}
[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; }
}
}
3、
注意:
1、首先要在oracle11g数据库中创建用户和授权
2、、指定数据库版本
OnConfiguring中
//按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入“11”代表11g,传入“12”代表12c。
optionsBuilder.UseOracle("Data Source=127.0.0.1:1521/orcl;User Id=my;Password=123456;"
, b => b.UseOracleSQLCompatibility("11")); //指定数据库版本
3、OnModelCreating中
//判断当前数据库是Oracle
if (Database.IsOracle())
{ //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置
//modelBuilder.HasDefaultSchema("EVMS");//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
//如果使用Oracle必须手动添加Schema,判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
modelBuilder.HasDefaultSchema("MY");//注意:DBA提供的数据库账号名称,这里的用户:my,密码:123456,用户名必须大写
}