EF Core + Oracle自动生成数据库
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 = "dept006", 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; } } }
注意:
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,用户名必须大写
}